你好,试图像投票一样做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 -->
答案 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之间的代码中添加某种显着的延迟,并且运行两个或多个进程。但即使在这种情况发生的“低音量,低概率”,你确实希望避免“最后更新获胜”的反模式。
因此,不需要检索列的当前值的代码部分,除非您正在检索要显示在页面上的那一部分,以显示当前的投票总数。