PHP MYSQL ROW UPDATE添加1

时间:2013-07-18 20:18:06

标签: php mysql database

你好,试图像投票一样做srcipt

So 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);
    }

但它不起作用,我不知道为什么

Theres the Post Form

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

***来自你的sugestions和答案的编辑最终代码仍然无效,我放弃了他们感谢所有人试图帮助我

cheeers

感谢大家的关注,我放弃了他们,代码有时是有效的,有时候没有,并且从答案中尝试了所有的事情。

theres代码btw一些修改了你的建议,但仍然无法正常工作

干杯!!

<!-- 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 --> 

3 个答案:

答案 0 :(得分:5)

为什么不尝试这个呢?

而不是查询然后更新
 UPDATE `tentego_img` SET `bitwa_glosy` = `bitwa_glosy` + 1  WHERE `id`=$aid

(并且,请注意SQL注入。如果您的用户设法为您提供“7; DROP TABLE TENTEGO_IMG;”的$ aid值,您的系统会发生什么?)

答案 1 :(得分:1)

将您的查询更改为

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

答案 2 :(得分: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.

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

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

因此,不需要检索列的当前值的代码部分,除非您正在检索要显示在页面上的那一部分,以显示当前的投票总数。