tokuisakiテーブルにnameフィールドがあります。
$myoujiが「太田」だったとします。
nameが「太田一郎」だった場合、「上太田一郎」さんは下記のSQL文で抽出されません。
select * from tokuisaki where name like '$myouji%'
nameが「太田川一郎」だった場合、「太田川一郎」さんは上記のSQL文で抽出されます。
これを「太田一郎」で抽出され「太田川一郎」だった場合、抽出されないようにしたいのですが。
$myoujiの文字数を数えて(例えば3文字)、nameの先頭から$myoujiの文字数分だけ(例えば3文字)同じ、
というSQLが書けません。
書いてうまくいかない構文
$mojisuu = mb_strlen( $myouji );
select * from tokuisaki where substr('name', 0, $mojisuu) = '$myouji'
実際はprepareステートメントを使って以下のように書いてます。
$mojisuu = mb_strlen($myouji);
$st02 = $dbh->prepare("select * from tokuisaki where substr('name',0,$mojisuu) = '$myouji' ORDER BY byear DESC");
$st02->execute();
エラーは出ないのですが1件も抽出されません。
おかしな箇所を教えてください。
よろしくお願いします。
PHP7です。
おかしな箇所を教えてください
substr 関数の一番目がシングルクォートで括られているところ。
'name' という文字列の頭から 2文字とかで比較することになります。
後、substr の第2引数が 0 なのも、気になります。
SQL の文法上は、位置の指定は 1始まりなので。
ただ、ゼロを許容する RDB があったような、なかったような(うろ覚え)。
MySQL だと、開始位置がゼロのときに言及されていないみたいです。
2018/10/20 14:02:26https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_substr
Oracle だと、ゼロのときには1と同じ動作をすると明記されていました(記憶にあったのはこれだったかな?
https://docs.oracle.com/cd/E16338_01/server.112/b56299/functions181.htm
僕は0で、エラーではないですが、一件も抽出されませんでした。アドバイスありがとうございます。
2018/10/20 14:13:14