簡體   English   中英

更新表格錯誤? (SQLSTATE [HY000]:一般錯誤)

[英]Updating table error? (SQLSTATE[HY000]: General error)

我目前收到此錯誤

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

任何幫助深表感謝。 我之前沒有遇到此錯誤,所以我不確定從這里去哪里。 它確實通過並更新了表

您通過在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";

您正在回收變量名並破壞循環。 重命名內部“查詢”,或者在使用它時以不同的方式進行結構化:

        $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通常太含糊。

加上有效使用准備好的語句:准備一次,並在必要時執行多次。

看起來您正在用逗號分隔值的列中,這對於關系數據庫是一個大問題。 而是在此處創建適當的一對多關系。 通過理解適當的數據庫規范化背后的想法嘗試避免違反零,一或無窮規則

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM