ホームページ  >  記事  >  バックエンド開発  >  PHP が PDO->exec() メソッドを使用する場合、データを挿入する前に exec() を使用してクエリを実行し、データが存在するかどうかを確認すると、後続の exec() によるデータの挿入が失敗します。

PHP が PDO->exec() メソッドを使用する場合、データを挿入する前に exec() を使用してクエリを実行し、データが存在するかどうかを確認すると、後続の exec() によるデータの挿入が失敗します。

WBOY
WBOYオリジナル
2016-06-20 12:36:021170ブラウズ

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__.'类提示错误:无效类型的数据库');		}


2 番目の段落: データの削除
			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__.'类提示错误:要删除的数据不存在。');		}
のみが返されます
ごめんなさい、ちょっと間違えてしまいました。ここでは、前の 2 つのコードはすべて問題になります。つまり、exec() メソッドが使用されています。最初のコードでは、exec() クエリは正しいですが、後続の exec(insert) が FALSE を返す場合、exec(query) が削除されると、exec(insert) は正常に実行されます。何が起こっているのか。 。 。
同時に、コードの 2 番目の部分の exec (クエリ) は確かに int(0) を返しますが、実際には int(1) を返す必要があります。データは存在するので、存在する場合のみ削除できますよね?したがって、これらは 2 つの問題であり、おそらく 1 つのバグが原因です。 SQL文には問題ないようです。

最初のコードの SQL ステートメント:

select ID,ENName from mh_forumpage where ENName="egfdfa"
これは、データを挿入する前のクエリ時に exec() によって実行される SQL ステートメントです。データベース名とフィールド名は正しいです。

実際には、データの削除と追加の操作前のクエリ検証を削除すれば、通常の機能を満たせるのですが、なぜそうなるのかわかりません。以前は mysqli を使用していましたが、PDO を使い始めたばかりです。

PDO::exec() は、発行した SQL ステートメントによって変更または削除された行の数を返します。影響を受ける行がない場合、PDO::exec() は 0

PDO を返します。 ::exec() は、SQL コマンド (変更または削除) によって影響を受ける行数を返します。影響を受ける行がない場合は、0 を返します。

したがって、PDO::exec() を使用してクエリを実行すると、 command 行が変更または削除されないため、0 のみが返される場合


この時点で、コードの最初の部分の exec() が 0 を返したことがわかり、これは正しいです。これは挿入前のクエリ検証であるため、0 を返すのが正しいです。ただし、後続の実行 (挿入) は FALSE を返します。前のクエリ検証が削除されると、後続の実行 (挿入) は再び機能します。分かりません。 。

2 番目のコードは削除操作です。exec() が使用される前にクエリ検証が実行されますが、戻り値は 0 です。データは存在するため、1 が返されるはずです。

PDO::exec() は、発行した SQL ステートメントによって変更または削除された行の数を返します。影響を受ける行がない場合、PDO::exec() は 0

PDO を返します。 ::exec() は、SQL コマンド (変更または削除) によって影響を受ける行数を返します。影響を受ける行がない場合は、0 を返します。

したがって、PDO::exec() を使用してクエリを実行すると、このとき、行は変更または削除されないため、0


のみが返されます。 。つまり、select ステートメントを実行すると、クエリが成功したかどうかに関係なく、0 が返されますか?その場合、結果セットのないクエリでは exec() を使用できません。
そうです!

exec を使用して select コマンドを実行できません

false が返された場合は、コマンドにエラーがあることを意味します
errorinfo メソッドによって返された結果を確認して、問題の内容を確認できます

そう!
exec を使用して select コマンドを実行できません

false が返された場合は、コマンドが間違っていることを意味します
errorinfo メソッドによって返された結果を確認して、問題の内容を確認できます



ありがとうございます。exec() メソッドを使用すると常に奇妙な問題が発生すると言いましたが、これで終わりです。どうもありがとう。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。