PHPでのwhere文について

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です。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2018/10/24 07:11:47
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4974ベストアンサー獲得回数2154

ポイント300pt

おかしな箇所を教えてください

substr 関数の一番目がシングルクォートで括られているところ。
'name' という文字列の頭から 2文字とかで比較することになります。

後、substr の第2引数が 0 なのも、気になります。
SQL の文法上は、位置の指定は 1始まりなので。
ただ、ゼロを許容する RDB があったような、なかったような(うろ覚え)。

他3件のコメントを見る
id:a-kuma3

MySQL だと、開始位置がゼロのときに言及されていないみたいです。
https://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

2018/10/20 14:02:26
id:kohhi

僕は0で、エラーではないですが、一件も抽出されませんでした。アドバイスありがとうございます。

2018/10/20 14:13:14

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません