0

こんにちは、Vote のような srcipt を実行しようとしています

したがって、行bitwa_glosy0に設定されます

ボタンを押すと、ポストメソッドの値が0から1に増加し、ボタンを押すたびに成長するはずです。

DB からの値の読み取り

$Query="SELECT * FROM tentego_img WHERE id='$aid'";
$QueryResult=mysql_query($Query);
while($Kol_a=mysql_fetch_array($QueryResult)){
$a_glos =$Kol_a['bitwa_glosy']; // Values= 0 

これで、bitwa_glosy の値が 0 であることがわかりました

そして増やそうとする

if(isset($_POST['glos_a']))

    {
        $plus = 1;
        $a_glos = $a_glos+$plus;
    $dodaj_glos_a = "UPDATE `tentego_img` SET `bitwa_glosy` = $plus WHERE `id`=$aid"; 
    $idzapytania = mysql_query($dodaj_glos_a);
    }

しかし、それは機能しません。理由はわかりません

投稿フォームがあります

<form method="post"><input type="submit" name="glos_a" value="Głosuj +"/></form>

***あなたの提案と回答から編集された最終コードそれでも機能しません、私はそれらをあきらめます私を助けようとしているみんなに感謝します

乾杯

注意してくれてありがとう、私はそれらをあきらめ、コードが機能する場合と機能しない場合があり、回答からすべてを試しました。

あなたの提案でいくつか変更されたコードがありますが、それでも機能しません

乾杯!!

<!-- Begin Block -->
<?php
$ilosc= 1;
$typ= 'img';




#Lewa
$Query="SELECT * FROM tentego_img WHERE type='img' ORDER BY RAND() LIMIT ".$ilosc;
$QueryResult=mysql_query($Query);
while($Kol=mysql_fetch_array($QueryResult)){
$atytul =$Kol['title'];
$asrc =$Kol['src'];
$aid =$Kol['id'];
}


#Prawa
$QueryResult=mysql_query($Query);
while($Kol1=mysql_fetch_array($QueryResult)){
$btytul =$Kol1['title'];
$bsrc =$Kol1['src'];
$bid =$Kol1['id'];
}



echo '<table border="0"><tr>';
echo '<td><span style="color:green">#1#</span> '.$atytul.'</td><td></td><td><span style="color:red">#2#</span> '.$btytul.'</td><tr>';
echo '<td><a href="/img/'.$aid.'/'.$atytul.'/"><img src="/upload/'.$asrc.'" alt="'.$atytul.'" title="'.$atytul.'" width="370px" height="370px" /></a>Liczba głósów:0<form method="post"><input type="submit" name="glos_a" value="Głosuj +"/></form></td><td><img src="./_themes/fajna/bitwa/vs.png" /></td>';
echo '<td><a href="/img/'.$bid.'/'.$btytul.'/"><img src="/upload/'.$bsrc.'" alt="'.$btytul.'" title="'.$btytul.'" width="370px" height="370px" /></a>Liczba głosów:0<form method="post"><input type="submit" name="glos_b" value="Głosuj +"/></form></td>';
echo '</tr></table>';
$plus = 1;
if(isset($_POST['glos_a']))
{
$a_glos = $a_glos+$plus;
     $dodaj_glos_a = "UPDATE `tentego_img` SET `bitwa_glosy` = `bitwa_glosy` + $plus WHERE `id`=$aid"; 
$idzapytania = mysql_query($dodaj_glos_a);
}
if(isset($_POST['glos_b']))
{

     $dodaj_glos_b = "UPDATE `tentego_img` SET `bitwa_glosy` = `bitwa_glosy` + $plus WHERE `id`=$bid"; 
$idzapytania2 = mysql_query($dodaj_glos_b);
}

?>
   </div>   
<!-- End Block --> 
4

3 に答える 3

5

クエリを実行してから更新する代わりに、これを試してみませんか?

 UPDATE `tentego_img` SET `bitwa_glosy` = `bitwa_glosy` + 1  WHERE `id`=$aid

(そして、SQL インジェクションにも注意してください。ユーザーが "7;DROP TABLE TENTEGO_IMG;" の $aid 値を与えることに成功した場合、システムはどうなりますか?)

于 2013-07-18T20:20:23.003 に答える
1

列に格納されている現在$plusの値に の値を追加するのではなく、列にの値を割り当てているため、「機能しません」 。$plus

これを修正するには、UPDATE クエリを次のように変更します。

"UPDATE `tentego_img` SET `bitwa_glosy` = $plus WHERE `id`=$aid";

これに:

"UPDATE `tentego_img` SET `bitwa_glosy` = `bitwa_glosy` + $plus WHERE `id`=$aid";
                                           ^^^^^^^^^^^^^^

あなたの質問には 0 の値が記載されています。現在の値がゼロの場合にのみこの行をインクリメントするかどうかは明確ではありません。また、この値はボタンを押すたびにインクリメントする必要があると述べています。これにより、ゼロからだけでなく、現在の値が何であれ、インクリメントしたいように聞こえます。

こんなことしないで:

"UPDATE `tentego_img` SET `bitwa_glosy` = $a_glos WHERE `id`=$aid";
                                          ^^^^^^^  

$a_glos を計算しているように見え、それを列に割り当てる意味があります。ただし、これを行うと同時実行性の問題が発生するため、「最後の更新が優先される」というアンチパターンになります。

これの 2 つ (またはそれ以上) のコピーが同時に (同時に) 実行されている場合に何が起こるかを考えてみてください。そのカウンターは、必要な回数よりも少ない回数インクリメントされ、予想よりも低い値になる可能性があります。

タイミングが正しければ、プロセスの各コピーが SELECT を実行し、たまたま同じ値を取得できることを考慮してください。次に、各プロセスがテーブルを更新します。後の更新で最初の更新が上書きされます。最終結果は、予想どおり、カウンターが 2 ではなく 1 ずつインクリメントされることです。

また、プロセスの 1 つで SELECT と UPDATE の間に大きな遅延が発生した場合、実際には、UPDATE の実行時にカウンターが現在の値よりも低く設定される可能性があります。

これを回避するには、アトミック操作を使用します。$plus現在の値を取得し、それに追加し、列を設定する単一のステートメントをすべて 1 つの操作で使用します。

(このアプローチは、ここの他の良い答えで示されています。)

並行性の問題のデモンストレーションとして、4 つのプロセスが同時に実行されている場合を考えてみましょう。

process 1    : select gets 0
process  2   : select gets 0
process   3  : select gets 0
process 1    : update set to 1
process    4 : select gets 1
process   3  : update set to 1
process    4 : update set to 2
process  2   : update set to 1

4 回の実行が完了すると、値が 4 に設定されることが期待されます。

しかし、確実に取得できる唯一の方法は、プロセス間に OVERLAP がない場合です。また、リソースへの「シリアル化された」アクセスを導入せずに、マルチユーザー、マルチスレッド環境でこれを保証することは不可能であり、不必要に複雑さが増し、スケーラビリティに影響を与えます。

この問題は、SELECT と UPDATE の間のコードになんらかの重大な遅延を追加したり、2 つ以上のプロセスを実行したりしない限り、単一ユーザーの開発テストで検出するのは困難です。しかし、これが発生する「ボリュームが少なく、確率が低い」場合でも、「最後の更新が勝つ」というアンチパターンは本当に避けたいと思います。

したがって、列の現在の値を取得するコードのセクションは必要ありません。もちろん、現在の投票合計を表示するためにページに表示するために取得する場合を除きます。

于 2013-07-18T21:07:10.323 に答える
1

クエリを次のように変更します

UPDATE tentego_imgSET bitwa_glosy= 'bitwa_glosy'+1 WHERE id=$援助

于 2013-07-18T20:22:29.103 に答える