ホームページ  >  記事  >  バックエンド開発  >  PDO パラメータの使用法について教えてください (長さの制限やバグがあります):

PDO パラメータの使用法について教えてください (長さの制限やバグがあります):

WBOY
WBOYオリジナル
2016-06-23 14:00:031305ブラウズ

PDO パラメーターの使用法 (長さ制限またはバグ) について質問します。

次の php コードがあります:
$tids='588316104237364, 573473840208171, 585814107854381';
$sql = 'SELECT trade_id,t id,tra de_md5 ,receiver_md5, order_md5,status,llc_no,modified_time FROM ep_trade WHERE tid in ( '.$tids.' ) および biz_id=? 制限 10000'
$stmt->execute($param) );
正しく実行でき、3 行のデータが返されます

ただし、書き方を変更してください:
$sql = 'SELECT trade_id,tid,trade_md5,receiver_md5,order_md5,status,llc_no,modified_time FROM ep_trade WHERE tid in ( ?) および biz_id=? 10000';
$param[0]=$tids;
$stmt->execute($param);

常に最初の 1 行だけを返しますか?なぜ。

実行環境: php5.1 centos 5.7, mysql 5.1

ポイントがたくさんあります、少し$を払っても構いません、解決してください、ありがとう。



ディスカッション(解決策)への返信
それは PDO のバグではなく、PDO のルールです。

PDO を使用する場合、注意が必要な状況がいくつかあります。


1. プレースホルダー ? で値のセットを置き換えることはできません。

select * from table where id in(?);
これは、セットの場合に発生した状況です。値の場合、最初の値だけが値として取られます。

2. プレースホルダーは、次のようなデータ テーブル名や列名の置換には使用できません。

select * from table order by ?;

3. プレースホルダーは、次のような他の SQL 構文の置換には使用できません。解決!
tid in (?)
は find_in_set(tid, ?) と書くことができます fdipzone へ ありがとうございます、返信は非常に明確です。

これらを検索できるリンクを教えていただけますか?特別なルールについて詳しく知りたいです。



それで十分のようです。

数字記号を変数として使用しないでください。そうしないと、注入が防止されません。

ありがとうございます。私は 2 年間 PHP に取り組んできましたが、この問題は見つかりませんでした。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。