更新表格错误? (SQLSTATE [HY000]:一般错误)

时间:2018-08-31 19:56:57

标签: php mysql

我当前遇到此错误

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

非常感谢您的帮助。我之前没有遇到此错误,所以我不确定从这里去哪里。 它确实会更新表

2 个答案:

答案 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