請教關於PDO的參數(有長度限制,或者Bug)用法:

來源:互聯網
上載者:User
請教關於PDO的參數(有長度限制,或者Bug)用法:

有如下句php代碼:
$tids='588316104237364, 573473840208171, 585814107854381';
$sql = 'SELECT trade_id,tid,trade_md5,receiver_md5,order_md5,status,llc_no,modified_time FROM ep_trade WHERE tid in ( '.$tids.' ) and biz_id=? limit 10000';
$param[0]=123;
$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 ( ? ) and biz_id=? limit 10000';
即將變數tid放到參數中:
$param[0]=$tids;
$param[1]=123;
$stmt->execute($param);

總是僅返回第一行?是為何呢。

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

分數很多,付點$也行的,求解,謝謝。


回複討論(解決方案)

不是PDO的bug,是PDO的規則如此。
使用PDO需要注意幾種情況

1.不能讓預留位置 ? 代替一組值,如:

select * from table where id in(?);

就是你遇到的情況,當是一組值時,只會取第一個值。

2.不能讓預留位置代替資料表名或列名,如:
select * from table order by ?;


3.不能讓預留位置 ? 代替任何其他SQL文法,如:
select extract(? from addtime) as dt from table;

正解!
所以 tid in ( ? )
可寫作 find_in_set( tid, ? )

to fdipzone 非常感謝,回複很清楚!

能否告訴個串連告訴這些從哪作搜尋到的?我想進一步瞭解下,還有什麼特別的規則。


貌似就?些了。
不要把?位符?作一??量,否?就不能防止注入。

真心的感謝,真是山外有山啊,做了2年php居然沒發現這個問題。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.