忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

PHP PDO prepareでLIKE(部分一致)検索するときのbindValueのパラメータ
ふつうに「%」で括ってもうまくいかない。
sqlを直に実行するとふつうに動くので、bindValueがうまくいっていない模様。
原因は、「%」をくっつけるタイミングでした。

$query = "select * from table where testdata like :value ";
$stmt = $pdo->prepare($query);
$stmt->bindValue(":value", '%'. $value .'%', PDO::PARAM_STR);


sql文中ではなく、bindValueのときに付けてあげるのが正しいみたい。

ちなみに間違ったのはこういう記述↓
$query = "select * from table where testdata like %:value% ";


あとこれも↓
$query = "select * from table where testdata like ':value' ";



参考URL
http://okwave.jp/qa/q3863004.html
PHP PDO 1つずつprepare・bindValueしなくて済む方法
where文を作るとき、検索条件がたくさん設定できると、ひとつずつprepareしてbindValueしてwhereとandで分けて……とやるのがめんどくさい。
そんなときの救世主コード↓

関数定義

function where($names, &$values) {
$wheres = $values = array();
foreach ($names as $name) {
if (isset($_REQUEST[$name]) && is_string($str = $_REQUEST[$name]) && $str !== '') {
$wheres[] = "{$name} = ?";
$values[] = $str;
}
}
return $wheres ? ' WHERE ' . implode(' AND ', $wheres) : '' ;
}



使用例

$pdo = new PDO('DSN', 'USERNAME', 'PASSWORD');
$params = array('name', 'gender', 'address');
$stmt = $pdo->prepare('SELECT * from myTable' . where($params, $values));
$stmt->execute($values);




これはすごい!きれいで便利!

そしてlikeもできる!

関数定義

function where($items, &$values) {
$wheres = $values = array();
foreach ($items as $item) {
$name = $item['name'];
$like = $item['like'];
if (isset($_REQUEST[$name]) && is_string($str = $_REQUEST[$name]) && $str !== '') {
if ($like) {
$wheres[] = "{$name} LIKE ?";
$values[] = '%' . addcslashes($str, '%_\\') . '%' ;
} else {
$wheres[] = "{$name} = ?";
$values[] = $str;
}
}
}
return $wheres ? ' WHERE ' . implode(' AND ', $wheres) : '' ;
}



使用例

$pdo = new PDO('DSN', 'USERNAME', 'PASSWORD');
$params = array(
array(
'name' => 'name',
'like' => FALSE,
),
array(
'name' => 'gender',
'like' => FALSE,
),
array(
'name' => 'address',
'like' => TRUE,
),
);
$stmt = $pdo->prepare('SELECT * from myTable' . where($params, $values));
$stmt->execute($values);




参考URL
http://qiita.com/mpyw/items/c64ce7477169a710f755
PHP/MySQL PDOの「SET NAMES」の代替策
MySQLから取得したデータの文字コード指定。
SET NAMESは非推奨らしいので、代わりになる書き方を探しました。

これでできるみたい↓


try {
$pdo = new PDO($db_dsn,$db_user, $db_password,
array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`"
)
);
} catch (PDOException $e) {
die($e->getMessage());
}




参考URL→
http://me.beginsprite.com/archives/889




間違ってたみたいです!!!
参考→http://qiita.com/hiro_y/items/6fabdef669e35e92bdc4
PHP PDOのfetchとfetchallの使い分け
PDO関数を使ってのMySQL接続を勉強中。
fetchallはなんとなくつかめたけど、fetchがどうもしっくりこない。
使い分けはトラフィックとかそのあたりみたい。
でもとりあえずfetchallで大丈夫なとこはそれでいいかなぁ。。。

ブクマメモ。
http://nkd920.blog10.fc2.com/blog-entry-36.html
WordPressプラグイン作成 check_admin_refererとsave_postフックのエラー
記事をインポートするプラグインを動かしたところ、「本当によろしいですか?」とメッセージが出るだけでその先に進めない(OKボタンが出てこない)
で、タイトルを見ると「WordPress エラー通知」と出てるので、どこかでプラグインが競合してるっぽい。

調べた結果、save_postのフックの処理が動いてしまっていました。
インポート時も動くんですねー。

そしてcheck_admin_refererのあたりで落ちているようです。
引数のnonceの値が取れてないよ!というのが原因。
nullのチェックはしてくれない模様。

//※nonceの値が取得できない場合は終了
if( ! $_POST['nonce_field']){
return $_POST->ID;
}


無理矢理ですが、こんなかんじで回避。

ちなみにsave_postは投稿画面だけでなく固定ページでも動いてしまいます。
「post」だから記事だけなのかと思ってた。。。
- 1 - 2 - 3 - 4
 top next
BACKGROUND / tudu*uzu
TEMPLATE / Lenny
忍者ブログ [PR]