PHP MYSQL ROW通过添加1进行更新


PHP MYSQL ROW UPDATE BY adding 1

嗨,正在尝试像投票一样进行srcipt

因此,行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>

***根据你的建议和答案编辑了最终代码,但仍然不起作用,我放弃了他们。谢谢所有试图帮助我的人

奶酪

感谢大家的关注,我放弃了他们,代码有时有效,有时无效,并尝试了所有答案。

有代码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 --> 

与其查询然后更新,为什么不试试这个呢?

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

(而且,请小心SQL注入。如果您的用户设法给您$aid值"7;DROP TABLE TENTEGO_IMG;",您的系统会发生什么?)

它"不起作用",因为您将$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之间的代码中添加某种显著的延迟,并且不运行两个或多个进程,那么在单用户开发测试中很难发现这个问题。但是,即使在"低容量、低概率"的情况下,你也确实希望避免"上次更新获胜"的反模式。

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

将查询更改为

更新tentego_img设置bitwa_glosy="bitwa_glosy"+1其中id=$aid