首页 > 解决方案 > 更新表错误?(SQLSTATE[HY000]:一般错误)

问题描述

我目前收到此错误

[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";

任何帮助深表感谢。我以前没有遇到过这个错误,所以我不知道从哪里开始。它确实通过并更新了表格

标签: phpmysql

解决方案


$query通过在 UPDATE 查询上重用它来破坏您的句柄,因此 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";

推荐阅读