1. 程式人生 > >解決PDO-mysql中LIMIT和IN子句執行失敗的問題

解決PDO-mysql中LIMIT和IN子句執行失敗的問題

  1. LIMIT子句執行失敗
    資料庫連線用的是PDO,遇到分頁的場景,
    offset.png
    在sql中的"LIMIT :offset, :pageSize"執行時model層的fetchAll()返回結果為空,原因是在model層繫結引數的時候$this-bindValue($placeHolder,$paramValue);時沒有顯示指定引數變數的型別,
    解決:
    在model層增加一個selectDatatype($var)函式返回繫結引數的型別用於在bindValue時顯示引數型別,
    QQ截圖20151213121011.png

bindValue.png
這樣就可以解決這個limit子句取不到結果集的問題了。
Tips: 在bindValue的時候一致使用bindValue($placeHolder,$param,PDO::PARAM_*type

*);以避免這種情況

  1. IN子句執行失敗
    2.png
    像上面這樣是返回空陣列的,下面的有返回資料:
    1.png
    但是,上面這樣的寫法只返回IN子句裡的第一個匹配項,無法返回IN子句裡所有的符合的項,查了下說轉成WHERE IN (?,?,?)然後在$in = '3,12,17';繫結為 $pdo->prepare($sql,$in);但是我的場景裡還有其它繫結引數並且需要一致用 $stmt->bindValue(':placeHandel' => $value);這種格式進行繫結的,所以,就直接給IN子句直接傳遞變數 WHRE id IN ($idRange),在傳遞的時候記得要過濾變數以防止sql注入。
    Tips: In子句中傳遞範圍的時候直接傳遞變數才行。

相關推薦

解決PDO-mysqlLIMITIN子句執行失敗的問題

LIMIT子句執行失敗 資料庫連線用的是PDO,遇到分頁的場景, 在sql中的"LIMIT :offset, :pageSize"執行時model層的fetchAll()返回結果為空,原因是在model層繫結引數的時候$this-bindValue($placeHolder

解決mysqllimitin不能同時使用的問題

但是 col ima 聚集 class mys mit table span 先給出數據表 CREATE TABLE `test_tb_grade` ( `ID` int(10) NOT NULL AUTO_INCREMENT, `USER_NAME` v

mysqllimitin不能同時使用的解決辦法

我就有以下的列子來解釋吧,這樣會更好的理解的! 一、新增teacher表和student表 teacher表 student表 二、假如只能同時二個人來查詢老師的資訊,請寫出sql語句實現 S

mysqlexistin的效率

如果查詢的兩個表大小相當,那麼用in和exists差別不大。 如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in: 例如:表A(小表),表B(大表) 1: select * from A where cc in (select cc from B) 效率低,用

MySqlexistsin的區別

exists介紹 exists對外表用loop逐條查詢,每次查詢都會檢視exists的條件語句,當 exists裡的條件語句能夠返回記錄行時(無論記錄行是的多少,只要能返回),條件就為真,返回當前loop到的這條記錄,反之如果exists裡的條 件語句不能返回記錄行,則當前loop到的這條

mysqlorin的效率問題 (有無索引差別很大o(n)/log(n))

mysql中or和in的效率問題        在網上一直看到的是or和in的效率沒啥區別,一直也感覺是這樣,前幾天剛好在看《mysql資料庫開發的36條軍規》的文章,裡面提到了or和in的效率問題,文中提到or的效率為O(n),而in的效率

mysqlexitin的區別

原文地址:https://segmentfault.com/a/1190000008709410 提前準備 為了大家學習方便,北哥在這裡面建立兩張表併為其新增一些資料 一張會員表,一張會員下單表。 會員表資料 id user email

解決MySQLlimit語句無法識別運算的問題

在MySQL中,分頁可以用limit實現SELECT * FROM person LIMIT 1,5;在limit中無法使用運算子:SELECT * FROM person LIMIT (2-1)*5,5;所以我們得先進行拼接再執行,程式碼如下:SET @stmt = CON

mysqlorin的效率問題

SELECT * FROM test WHERE id=93674701 OR id=9720356 OR id=31732184 OR id=53855095 OR id=33144472 OR id=71864888 OR id=27541768 OR id=27238726 OR id=836484

MySQL查詢條件existsin的區別

 mysql中的in語句是把外表和內表作hash 連線, 而exists語句是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。 一直大家都認為exists比in語句的效率要高,這種說法其實是不準確的。要分情況討論: 1. 如果查詢的兩個表大小相當,那麼用in和e

MyBatis查詢List結果丟失(MysqlOrderBylimit混用導致)

最近做專案遇到持久層使用MyBatis查詢時,出現查詢的結果在log4g日誌中顯示是5條,但是在List中取出的時候只有一條的情況,SQL語句沒有問題.問題原因:   1.首先檢查是否是多表聯查時主鍵重複了2.值得注意的是Mysql中limit和orderBy一起用由於Mys

題外話+Mysqllimit後不能跟變數問題的解決方法

先說兩句體外話:好久沒在CSDN的blog寫東西了,一個原因是自己最近工作比較忙,最主要的原因還是CSDN的blog反映太遲鈍,偶爾有想法想記錄下來,開啟部落格主頁都打不開,要麼進度條在下面緩慢的載入,要麼乾脆就報 已取消到該網頁的導航

mysqlorderbylimit同時使用的bug

我的SQL很簡單 我想從一個表中檢索所有標題含有“中國”的資料,將它們按id排序,取前5條,所以我寫了以下語句 SQL語句1: select fi_id, fi_url, fi_title from InfoTable where fi_title like '%中國%' order by fi_id des

mysqlreplicate_wild_do_tablereplicate_do_db區別

lan rep cati mil 多人 pan think lte 避免 使用replicate_do_db和replicate_ignore_db時有一個隱患,跨庫更新時會出錯。 如在Master(主)服務器上設置 replicate_do_db=test(my.conf

MySQLTIMESTAMPDIFFTIMESTAMPADD函數的用法

用法 int blog 函數 mysq second row logs tail TIMESTAMPDIFF 語法: TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)。 說明: 返回日期或日期時間表達式date

mysqlvarcharchar區別(思維導圖整理)

var 但是 系統 mysql 由於 varchar .html nbsp 了解   由於mysql一直是我的弱項(其實各方面我都是很弱的),所以最近在看msyql,正好看到varchar和char區別,所以整理一下,便於以後遺忘。      0.0圖片已經說明一切,但是系

mysqlLOCATECASE WHEN...THEN...ELSE...END結合用法

else case put asdf span 項目 oos bstr col 之前項目中需要寫一個sql,就是查出某個調研詳情中,選A答案,B答案,C答案...F答案的人各有多少人,這個sql也是費了很大的力氣才寫出來,故記下來,方便以後使用。 其中tbl_researc

mysql deletetrncate區別

重新 sql delet use 它的 刪除 掃描 進行 from mysql中刪除表記錄delete from和truncate table的用法區別: MySQL中有兩種刪除表中記錄的方法:(1)delete from語句,(2)truncate table語句。 d

mysql字符集排序規則說明

存儲 blog character 語言 general utf 比較 說明 target 數據庫需要適應各種語言和字符就需要支持不同的字符集(Character Set),每種字符集也有各自的排序規則(Collation)。 一.字符集 字符集,即用於定義字

mysqlconcat group_concat()的用法

sub concat order by 返回 int 連接 插入 sep 結果 一、CONCAT()函數CONCAT()函數用於將多個字符串連接成一個字符串。使用數據表Info作為示例,其中SELECT id,name FROM info LIMIT 1;的返回結果為+--