0

嗨,尝试像投票一样做 srcipt

所以 Row bitwa_glosy设置为0

当我按下按钮时,发布方法应该将值从 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 注入。如果您的用户设法给您一个 $aid 值“7;DROP TABLE TENTEGO_IMG;”,您的系统会发生什么?)

于 2013-07-18T20:20:23.003 回答
1

将您的查询更改为

更新tentego_imgbitwa_glosy= 'bitwa_glosy'+1 在哪里id=$aid

于 2013-07-18T20:22:29.103 回答
1

它“不起作用”,因为您正在将值分配给$plus列,而不是将值添加$plus到存储在列中的 CURRENT 值。

要解决此问题,请从以下更改 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 以及将其分配给列的含义。但不要这样做,因为这会引入并发问题,即“最后更新获胜”的反模式。

考虑当两个(或更多)副本同时(同时)运行时会发生什么。该计数器可能会比它应该增加的次数更少,并最终得到一个低于预期的值。

考虑到进程的每个副本都可以运行 SELECT,并且如果时机合适,则碰巧检索到 SAME 值。然后,每个进程都将更新表。以后的更新将覆盖第一个。最终结果是计数器增加 1 而不是 2,正如我们所期望的那样。

而且,如果在其中一个进程中的 SELECT 和 UPDATE 之间发生了一些很大的延迟,那么当 UPDATE 运行时,计数器实际上可能被设置为低于其当前值。

为避免这种情况,请使用原子操作。使用单个语句检索当前值,添加$plus到它,然后设置列,所有这些都在一个操作中完成。

(这种方法在这里的其他好的答案中得到了证明。)

作为并发问题的演示,当四个进程同时运行时考虑这个:

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。

但是我们保证得到的唯一方法是进程之间没有重叠。如果不引入对资源的“序列化”访问,这是不可能在多用户、多线程环境中保证的,这会不必要地增加复杂性并影响可伸缩性。

这个问题很难在单用户开发测试中发现,如果不在 SELECT 和 UPDATE 之间的代码中添加某种明显的延迟,并且运行两个或多个进程。但即使发生这种情况的“数量少、概率低”,您也确实希望避免“最后更新获胜”的反模式。

因此,没有必要检索列的当前值的那段代码,当然,除非您检索它以显示在页面上,以显示当前的投票总数。

于 2013-07-18T21:07:10.323 回答