MySQL は、update、delete、insert ステートメントが正常に実行されたことをどのように確認しますか?

WBOY
リリース: 2016-06-23 13:26:03
オリジナル
2718 人が閲覧しました

タイトルにあるように、現在は mysql_affected_rows() によって判断しています。これは、ほぼすべての update、delete、insert ステートメントの後に
if(mysql_affected_rows()!=1) という文が続く必要があることを意味します
{
エラー報告
}

もっと簡単な方法は何ですか?


ディスカッションへの返信 (解決策)

mysql_affected_rows は、実行が成功したかどうかを確認するために使用されるのではなく、関連する SQL 命令が操作されたレコードの数を観察するために使用されます

直接
if(执行sql语句){.....}else{......}
ログイン後にコピー

l_affected_rows 対象外実行が成功したかどうかの検査

は、関連する SQL 命令が実行されたレコードの数を観察するために使用されます

が私の質問です。私は、insert、delete、update ステートメントが少なくとも 1 つの行に影響を与えたことを確認したいだけです

影響を受けた行の数を確認するには、mysql_affected_rows() を実行する必要があります。

影響を受ける行が何行(0 行も含む)であっても、エラーではありません

影響を受ける行が何行(0 行を含む)であっても、エラーではありません

もちろん、これは知っています。 。 。

タイトルにあるように、常に mysql_affected_rows() によって判断されます。これは、ほぼすべての update、delete、insert 文の後に

if(mysql_affected_rows()!=1)
{
エラー レポートが続く必要があることを意味します。
}

聞いてください 何か簡単な方法はありますか?


補足すると、update、delete、insert文が少なくとも1行に影響を与えていると判断したいのですが、多くの場合そのような判断ロジックが必要なようです
理由は、update、delete、insertが0行であっても影響があるからです。行を更新すると、トランザクションはロールバックされないため、この問題が発生します

更新に条件を満たすレコードがない場合、変更された値が元の値と同じである場合、変更されません。実際には変更は行われません。

削除 条件を満たすレコードが存在しない場合は削除されません。条件を満たすレコードが複数ある場合は、当然まとめて削除されます。
挿入は 100 件のレコードであっても 1 つのみに影響します。省略された挿入ステートメントを使用して挿入されます

これがトランザクションとどのような関係があるのか​​わかりません

update 条件を満たすレコードがない場合、変更された値が同じ場合は変更されません。元の値のままでは実際には変更されません

delete 条件を満たすレコードが無い場合は削除されません 条件を満たすレコードが複数ある場合は当然レコードも削除されます
insert のみに影響します。短縮された挿入ステートメントを使用して 100 個が挿入されたとしても 1 つ

これがトランザクションと何の関係があるのか​​わかりません


よく考えてみると、あなたの言ったことは理にかなっています。
私の質問の例を挙げてみましょう:
たとえば、ユーザーが仮想アイテムを購入するために仮想通貨を使用したい場合、更新後 ... setmoney= ... ここで user_id =... ステートメントが実行されると、 1 行が正常に更新されたことを確認するには、mysql_affected_rows() を使用する必要がありますか?実際にお金のフィールドが更新されていないのではないかと心配なので、ユーザーに仮想アイテムを追加する次の作業を実行します
以前に更新のために select Money from ... を実行した場合、確実であることが保証されますか?

update 条件を満たすレコードがない場合、変更されません。 変更された値が元の値と同じ場合、実際には変更されません。
削除 条件を満たすレコードがない場合。複数のレコードがある場合、条件を満たすレコードは自然にまとめて削除されます
短縮された挿入ステートメントを使用して 100 件のレコードが挿入された場合でも、挿入は 1 つのレコードにのみ影響します

これが何なのかわかりません取引に関係があります


よく考えてみると、あなたの言ったことは理にかなっています。
私の質問の例を挙げてみましょう:
たとえば、ユーザーが仮想アイテムを購入するために仮想通貨を使用したい場合、更新後 ... setmoney= ... ここで user_id =... ステートメントが実行されると、 1 行が正常に更新されたことを確認するには、mysql_affected_rows() を使用する必要がありますか?実際にお金のフィールドが更新されていないのではないかと心配なので、ユーザーに仮想アイテムを追加する次の作業を実行します
以前に更新のために select Money from ... を実行した場合、確実であることが保証されますか?

Direct if (更新操作....) {購入成功...}else {購入失敗....} は問題ありません。更新操作は失敗し、false を返します

$result = mysql_query("update ……")if ($result !== false){    echo "exec success";}else{    echo "exec error:".mysql_error():}
ログイン後にコピー
ログイン後にコピー



update 没有符合条件的记录,就不会修改,如果被修改的值和原值一样,则修改不会真正发生
delete 没有符合条件的记录,就不会删除,如果有多条符合条件的记录,自然也就一并删除了
insert 只会影响一条,哪怕是用缩略写法的 insert 语句插入了 100 条

看不出这与事务有什么关系



想了一下,你说的有道理。
我把我的疑问举个例子:
比如用户要用虚拟货币购买虚拟物品,在update ... set money= ... where user_id=... 这条语句执行后,需不需要mysql_affected_rows()来验证成功update了1行呢?我担心没真正update到money字段,然后就执行了下面给该用户添加虚拟物品的业务
如果在之前执行了select money from ... for update,就能保证万无一失吗?


直接if (update操作....){购买成功...}else{购买失败....}不就好了,update操作失败返回的是false



好的我决定试一下,看起来比mysql_affected_rows简洁,不知道效果上有没有什么细微差别

$result = mysql_query("update ……")if ($result !== false){    echo "exec success";}else{    echo "exec error:".mysql_error():}
ログイン後にコピー
ログイン後にコピー


同上,谢谢,准备试一下效果

如果你不放心 update ... set money=money-1 会真实执行的话
那么你是否需要再 select 一下,确认 money 减少了 1,而不是减少了 100 呢?

$result = mysql_query("update ……")
只有在 sql 指令是错误的情况下,才会返回 false 
所以并不需要去试

如果你不放心 update ... set money=money-1 会真实执行的话
那么你是否需要再 select 一下,确认 money 减少了 1,而不是减少了 100 呢?

$result = mysql_query("update ……")
只有在 sql 指令是错误的情况下,才会返回 false 
所以并不需要去试

如果你不放心 update ... set money=money-1 会真实执行的话
那么你是否需要再 select 一下,确认 money 减少了 1,而不是减少了 100 呢?

$result = mysql_query("update ……")
只有在 sql 指令是错误的情况下,才会返回 false 
所以并不需要去试


好的,感觉你说的听起来比较靠谱,谢谢。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート