我当前遇到此错误
[31-Aug-2018 15:50:46 America/New_York] PHP Fatal error: Uncaught
exception 'PDOException' with message 'SQLSTATE[HY000]: General error'
in /home/crysuicn/public_html/products.php:22
Stack trace:
#0 /home/crysuicn/public_html/products.php(22): PDOStatement->fetch(2)
#1 {main}
thrown in /home/crysuicn/public_html/products.php on line 22
第22行是:
while($row = $query->fetch(PDO::FETCH_ASSOC)){
因此,错误可能在此处,但是我看不出错误可能是什么。
if(isset($_SESSION["discount"])){
if($_SESSION["discount"] != "na"){
$sql = "SELECT users FROM discounts WHERE name=:promo";
$query = $st->prepare($sql);
$query->execute(array(
'promo' => $name
));
if($query->rowCount()>0){
while($row = $query->fetch(PDO::FETCH_ASSOC)){
if(!empty($row["users"])){
$usedips = $row["users"];
$usedips = $usedips.", ".$_SERVER["REMOTE_ADDR"];
}else{
$usedips = $_SERVER["REMOTE_ADDR"];
}
$sql = "UPDATE discounts SET users=:updatedips WHERE name=:name";
$query = $st->prepare($sql);
$query->execute(array(
'updatedips' => $usedips,
'name' => $name
));
}
}
}
}
$_SESSION["discount"] = "na";
非常感谢您的帮助。我之前没有遇到此错误,所以我不确定从这里去哪里。 它确实会更新表
答案 0 :(得分:1)
通过在UPDATE查询上重用$query
句柄,从而破坏了while循环。
因此,请对UPDATE中使用的语句句柄使用另一个变量。
最好只准备一次查询并重复使用多次,只需替换变量即可。这使数据库只能一次编译和优化查询,但可以多次运行。这样可以更快地执行脚本,并减少了不必要的数据库负载。
if(isset($_SESSION["discount"])){
if($_SESSION["discount"] != "na"){
$sql = "SELECT users FROM discounts WHERE name=:promo";
$query = $st->prepare($sql);
$query->execute(array('promo' => $name));
if($query->rowCount()>0){
// prepare once use many times
$sql = "UPDATE discounts
SET users=:updatedips WHERE name=:name";
$stmt= $st->prepare($sql);
while($row = $query->fetch(PDO::FETCH_ASSOC)){
if(!empty($row["users"])){
$usedips = $row["users"];
$usedips = $usedips.", ".$_SERVER["REMOTE_ADDR"];
}else{
$usedips = $_SERVER["REMOTE_ADDR"];
}
$stmt->execute(array('updatedips' => $usedips,'name' => $name));
}
}
}
}
$_SESSION["discount"] = "na";
答案 1 :(得分:1)
您正在回收变量名并破坏循环。重命名内部的“查询”,或者在使用时以不同的方式构造它:
$select = $st->prepare("SELECT users FROM discounts WHERE name=:promo");
$select->execute(array(
'promo' => $name
));
$update = $st->prepare("UPDATE discounts SET users=:updatedips WHERE name=:name");
if ($select->rowCount() > 0) {
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
if(!empty($row["users"])){
$usedips = $row["users"];
$usedips = $usedips.", ".$_SERVER["REMOTE_ADDR"];
} else {
$usedips = $_SERVER["REMOTE_ADDR"];
}
$update->execute(array(
'updatedips' => $usedips,
'name' => $name
));
}
}
尽可能为变量提供有意义的上下文名称。 $query
通常太含糊。
加上有效使用准备好的语句:准备一次,并在必要时执行多次。
看起来您正在用逗号分隔值的列中,这对于关系数据库是一个大问题。而是在此处创建适当的一对多关系。通过理解适当背后的想法,尝试避免违反Zero, One or Infinity Rule database normalization。