创建查询无效参数编号时出错


Error creating a query invalid parameter number

以下脚本引发此错误:

SQLSTATE[HY093]:无效的参数编号:未定义参数

错误来自以下行:

$query .= "WHERE username1=:un1";
$binValues["un1"] = $_POST['username1'];

php语法有问题吗?

我的完整脚本:

<?php
    require_once "config.inc.php";  
    $query = "UPDATE customer SET ";
    $binValues = [];

    if(!empty($_POST['eidosmetaf1'])) {
        $query .= "eidosmetaf1 = :e1";
        $binValues["e1"] = $_POST['eidosmetaf1'];
    }
    if(!empty($_POST['weight1'])) {  
        $query .= ",weight1 = :w1";
        $binValues["w1"] = $_POST['weight1'];
    }
    if(!empty($_POST['startNomos1'])){ 
        $query .= ",startNomos1 = :sn1";
        $binValues["sn1"] = $_POST['startNomos1'];
    }
    if(!empty($_POST['startPoli1'])) { 
        $query .= ",startPoli1 = :sc1";
        $binValues["sc1"] = $_POST['startPoli1'];
    }
    if(!empty($_POST['start_lat'])) { 
        $query .= ",start_lat = :slat1";
        $binValues["slat1"] = $_POST['start_lat'];
    }
    if(!empty($_POST['start_lng'])) { 
        $query .= ",start_lng = :slng1";
        $binValues["slng1"] = $_POST['start_lng'];
    }
    if(!empty($_POST['finalNomos1'])) { 
        $query .= ",finalNomos1 = :fn1";
        $binValues["fn1"] = $_POST['finalNomos1'];
    }
    if(!empty($_POST['finalPoli1'])) {  
        $query .= ",finalPoli1 = :fc1";
        $binValues["fc1"] = $_POST['finalPoli1'];
    }
    if(!empty($_POST['final_lat'])) {  
        $query .= ",final_lat = :flat1";
        $binValues["flat1"] = $_POST['final_lat'];
    }
    if(!empty($_POST['final_lng'])) {  
        $query .= ",final_lng = :flng1";
        $binValues["flng1"] = $_POST['final_lng'];
    }
    if(!empty($_POST['depDate1'])) {  
        $query .= ",depDate1 = :dD1";
        $binValues["dD1"] = $_POST['depDate1'];
    }
    if(!empty($_POST['depTime1'])) { 
        $query .= ",depTime1 = :dT1";
        $binValues["dT1"] = $_POST['depTime1'];
    }
    if(!empty($_POST['specialservices1'])) {  
        $query .= ",specialservices1 = :ex1";
        $binValues["ex1"] = $_POST['specialservices1'];
    }
    if(!empty($_POST['comments1'])) {  
        $query .= ",comments1 = :c1";
        $binValues["c1"] = $_POST['comments1'];
        }   
        //error here
        $query .= "WHERE username1=:un1";
        $binValues["un1"] = $_POST['username1'];    

        $query .= "and comments1=:c1_old";
        $binValues["c1_old"] = $_POST['comments2_old'];

    try {
        $stmt = $db->prepare($query);
        $stmt->execute($binValues);
    } catch (PDOException $ex) {
        $response["success"] = 0;
        $response["message"] = "Database Error2. Please Try Again!";
        echo $ex->getMessage();
        die(json_encode($response));
    }    
    $response["success"] = 1;
    $response["message"] = "..............!";
    echo json_encode($response); 

?>

由于我已经修复了您以前的代码,我建议您使用我的答案中的代码:https://stackoverflow.com/a/29354781/3933332因为阅读和理解起来要简单得多。

如果你使用我的代码,你可以像这样添加WHERE子句:

<?php
    //...
    foreach($checkedValues as $k => $v) {
        $query .= "$v = :$k,"; 
        $bindValues[$k] = $_POST[$v];
    }
    $query = rtrim($query, ",");
    //fixed code here
    if(isset($_POST['username1'])) {
        $query .= " WHERE username1=:un1";
        $bindValues["un1"] = $_POST["username1"];
    }
    if(isset($_POST['comments1'])) {
        $query .= " AND comments1=:c1_old";
        $bindValues["c1_old"] = $_POST["comments1"];
    }

    try {           
        $stmt = $db->prepare($query);
        $stmt->execute($binValues);         
    } catch (PDOException $ex) {
        $response["success"] = 0;
        $response["message"] = "Database Error2. Please Try Again!";
        echo $ex->getMessage();
        die(json_encode($response));
    }    
    //...
?>
$binValues[":un1"] = $_POST['username1']