PHP用PDO->exec()方法時在插入資料前用exec()查詢驗證資料是否存在會導至後面的exec()插入資料失敗

來源:互聯網
上載者:User
PHP用PDO->exec()方法時在插入資料前用exec()查詢驗證資料是否存在會導至後面的exec()插入資料失敗,這是為什嗎?
當插入資料時,重複插入同樣的資料會導至失敗,這很好理解。但是為什麼在插入之前用exec()查詢一遍,且資料不存在,還會導至exec()插入資料失敗呢?


回複討論(解決方案)

貼出你的代碼,並作出說明

總共兩兩處讓人費解的地方,分別是不同方法中的,第一段片段是Add()方法中的,也就是封裝的插入資料方法。
剛剛修複了幾處BUG,那個執行了exec()查詢後執行exec()插入返回0的問題似乎是個烏龍,但是問題一直存在。就是exec()查詢時返回的是0,但資料明明存在。
第二段是資料刪除方法,同樣的問題,也是用exec()時傳回值是0,但資料明明存在。SQL語句似乎也沒看出有什麼問題。

case 'pdo':$PDO=$this->Connect;//pdo執行個體化對象try {#$isQuery===1時進行查詢驗證if($isQuery===1){$QSQL='select '.$strQTitle.' from '.$strTable.' where '.$strQTitle.'="'.$Value.'"';//select ID,ENName from mh_forumpage where ENName="egfdfa"$QuerySQL=$PDO->exec($QSQL);#說明:如果用exec查詢一條語句沒查到再插入這條資料時,會導致插入失敗。//$QuerySQL=$this->Query($strQTitle,$strTable,$strQTitle,$Value);if($QuerySQL!==0 or $QuerySQL!=FALSE){                                                       //*********程式執行後此處會被執行,因為$QuerySQL傳回值是int(0),但資料明明存在。die('
'.__CLASS__.'類 '.__FUNCTION__.'() 方法提示錯誤:要添加的值已存在。或SQL語句出錯。');}}#添加語句$EXEC=$PDO->exec($SQL);//沒有結果集的SQL執行使用exec();if($EXEC===0 or $EXEC==FALSE){//在SQL語句執行失敗時會返回個同等於FALSE類型,如NULLreturn FALSE;}else{return $EXEC;//刪除成功,返回影響條數}} catch (Exception $e) {echo '錯誤資訊:'.$e->getMessage();}break;default:die('
'.__CLASS__.'::'.__FUNCTION__.'類提示錯誤:無效類型的資料庫');}


第二段:刪除資料
case 'pdo':$PDO=$this->Connect;try {#查詢驗證,其查詢值不要加雙引號,因為前面已經對數字或字元處理過了。正常情況下exec會返回數字,當SQL語句出錯時會返回相當於FALSE的值。$QSQL='select '.$strQTitle.' from '.$strTable.' where '.$strQTitle.'='.$Value;$QueryExec=$PDO->exec($QSQL);var_dump($QueryExec);if($QueryExec===0 or $QueryExec==FALSE){                                                //************同樣這裡會被執行,因為$QueryExec傳回值是0die('
'.__CLASS__.'::'.__FUNCTION__.'類提示錯誤:要刪除的資料不存在。');}#刪除資料,注意,刪除失敗會返回0,而不是FALSE$EXEC=$PDO->exec($SQL);//沒有結果集的SQL執行使用exec();if($EXEC===0 or $EXEC===FALSE){return FALSE;}else{return $EXEC;//刪除成功,返回影響條數}} catch (Exception $e) {echo '錯誤資訊:'.$e->getMessage();}break;

PDO::exec() returns the number of rows that were modified or deleted by the SQL statement you issued. If no rows were affected, PDO::exec() returns 0
PDO::exec() 返回你的 SQL 指令(修改或刪除)所影響的行數,如果沒有行受影響,則返回 0

因此當你用 PDO::exec() 去執行查詢指令時,由於不會有行被修改或刪除,所以只會返回 0

$QSQL='select '.$strQTitle.' from '.$strTable.' where '.$strQTitle.'='.$Value;$QueryExec=$PDO->exec($QSQL);var_dump($QueryExec);if($QueryExec===0 or $QueryExec==FALSE){die('
'.__CLASS__.'::'.__FUNCTION__.'類提示錯誤:要刪除的資料不存在。');}


不好意思,我有點弄亂了。前面那兩段代碼都是此處的問題,就是使用了exec()方法。第一段代碼是exec()查詢正確,但是後面的exec(插入)就返回是FALSE了,如果去掉exec(查詢),那麼exec(插入)就被成功執行了。這是什麼情況。。。
與此同時,第二段代碼中exec(查詢)返回的確是int(0),而實際上應該返回int(1)才對。因為資料是存在的,存在才能進行刪除不是?所以這是兩個問題,估計是一處毛病導至的。SQL語句似乎也沒什麼問題。

第一段代碼的SQL語句:
select ID,ENName from mh_forumpage where ENName="egfdfa"

這是插入資料之前進行查詢時exec()執行的SQL語句。資料庫和欄位名都是對的。

其實如果把刪除和添加資料操作前的查詢驗證刪掉也是能滿足正常功能的,但是不明白為什麼會這樣。以前用的是mysqli,用PDO剛剛不久。

PDO::exec() returns the number of rows that were modified or deleted by the SQL statement you issued. If no rows were affected, PDO::exec() returns 0
PDO::exec() 返回你的 SQL 指令(修改或刪除)所影響的行數,如果沒有行受影響,則返回 0

因此當你用 PDO::exec() 去執行查詢指令時,由於不會有行被修改或刪除,所以只會返回 0



這點上知道,第一段代碼的exec()返回了0這是正確的,因為這是在插入前進行查詢驗證,返回0是正確的。但後面的exec(插入)則返回的是FALSE,如果去掉了前面的查詢驗證,後面的exec(插入)又好使了。不理解。。

第二段代碼,是刪除操作,刪除前進行查詢驗證,使用的是exec(),但是傳回值是0,資料存在,應該返回1才對。

PDO::exec() returns the number of rows that were modified or deleted by the SQL statement you issued. If no rows were affected, PDO::exec() returns 0
PDO::exec() 返回你的 SQL 指令(修改或刪除)所影響的行數,如果沒有行受影響,則返回 0

因此當你用 PDO::exec() 去執行查詢指令時,由於不會有行被修改或刪除,所以只會返回 0



哦。。也就是說執行select語句時,無論查詢是否成功,返回的都是0嗎?那樣的話無結果集的查詢就不能用exec()了。

對的!
select 指令不能用 exec 去執行

如果返回 false 時,就表示指令有錯了
可通過查看 errorinfo 方法返回的結果來指導究竟是什麼問題

對的!
select 指令不能用 exec 去執行

如果返回 false 時,就表示指令有錯了
可通過查看 errorinfo 方法返回的結果來指導究竟是什麼問題



謝謝,又減少一個誤區,我說的用exec()方法時一直有奇怪的問題,原來如此。非常感謝。
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.