忍者ブログ
[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 substrで文字化け→半角全角混在が原因!
substrでバイト単位での文字列の切り取り。
ときどき文字化けが起こるけれど、末尾だけなので文字コードの問題ではなさそう。
いろいろ試した結果、半角と全角が混在している文章のときに発生するようで、バイト指定で切り取られたことで末尾の文字が中途半端に出力されていたようです。

【方法1】
mb_substr を使う。

こっちはマルチバイト対応なので、半角全角が混在していても問題なく取れますが、バイト指定ではなく文字数指定なので今回はNG。

【方法2】
mb_strimwidth を使う。

指定した幅で文字列を丸める。幅=バイト数のようです。文字コードも指定できるので、今回はこれで解決できました!
第4引数の「丸めた後にその文字列の最後に追加される文字列」を指定すると、これも含めたバイト数として計算されるようなので注意。

mb_strimwidth
http://www.php.net/manual/ja/function.mb-strimwidth.php

 top
BACKGROUND / tudu*uzu
TEMPLATE / Lenny
忍者ブログ [PR]