ホームページ >バックエンド開発 >PHPチュートリアル >PHP が PDO->exec() メソッドを使用する場合、データを挿入する前に exec() を使用してクエリを実行し、データが存在するかどうかを確認すると、後続の exec() によるデータの挿入が失敗します。
PHP が PDO->exec() メソッドを使用する場合、データを挿入する前に exec() を使用してデータが存在するかどうかをクエリして確認すると、後続の exec() によるデータの挿入が失敗します。これはなぜですか?
データを挿入する際、同じデータを繰り返し挿入すると失敗するのは分かりやすいです。しかし、挿入前に exec() でクエリを実行すると、データが存在しないのに、exec() がデータの挿入に失敗するのはなぜでしょうか。
投稿コードと説明
合計 2 つまたは 2 つの紛らわしい場所があり、それらは異なるメソッド内にあります。最初のフラグメントは、カプセル化されたデータ メソッドである Add() メソッドのものです。
exec() クエリを実行してから exec() 挿入を実行して 0 を返す問題は、いくつかのバグが修正されたばかりですが、問題はまだ存在します。つまり、exec() クエリは 0 を返しますが、データは明らかに存在します。
2 番目の段落はデータの削除方法です。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('<br />'.__CLASS__.'类 '.__FUNCTION__.'() 方法提示错误:要添加的值已存在。或SQL语句出错。'); } } #添加语句 $EXEC=$PDO->exec($SQL); //没有结果集的SQL执行使用exec(); if($EXEC===0 or $EXEC==FALSE){ //在SQL语句执行失败时会返回个同等于FALSE类型,如NULL return FALSE; }else{ return $EXEC;//删除成功,返回影响条数 } } catch (Exception $e) { echo '错误信息:'.$e->getMessage(); } break; default: die('<br />'.__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返回值是0 die('<br />'.__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() は、SQL ステートメントによって変更または削除された行の数を返します。影響を受ける行がない場合、PDO::exec() は 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('<br />'.__CLASS__.'::'.__FUNCTION__.'类提示错误:要删除的数据不存在。'); }のみが返されます
select ID,ENName from mh_forumpage where ENName="egfdfa"これは、データを挿入する前のクエリ時に exec() によって実行される SQL ステートメントです。データベース名とフィールド名は正しいです。
PDO::exec() は、発行した SQL ステートメントによって変更または削除された行の数を返します。影響を受ける行がない場合、PDO::exec() は 0
PDO を返します。 ::exec() は、SQL コマンド (変更または削除) によって影響を受ける行数を返します。影響を受ける行がない場合は、0 を返します。
したがって、PDO::exec() を使用してクエリを実行すると、 command 行が変更または削除されないため、0 のみが返される場合
PDO::exec() は、発行した SQL ステートメントによって変更または削除された行の数を返します。影響を受ける行がない場合、PDO::exec() は 0
PDO を返します。 ::exec() は、SQL コマンド (変更または削除) によって影響を受ける行数を返します。影響を受ける行がない場合は、0 を返します。
したがって、PDO::exec() を使用してクエリを実行すると、このとき、行は変更または削除されないため、0
exec を使用して select コマンドを実行できません
false が返された場合は、コマンドにエラーがあることを意味します
errorinfo メソッドによって返された結果を確認して、問題の内容を確認できます
そう!
exec を使用して select コマンドを実行できません
false が返された場合は、コマンドが間違っていることを意味します
errorinfo メソッドによって返された結果を確認して、問題の内容を確認できます