【问题标题】:How should I fix this mysqli prepare statement?我应该如何修复这个 mysqli 准备语句?
【发布时间】:2013-05-31 03:25:49
【问题描述】:

我对 PHP 和 SQL 非常陌生。对于学校作业,我需要为用户创建一个表单来更新客户数据。但是,我注意到更新函数只更新数据集中最后一个 ID 的客户。例如,如果我在数据集中有 4 个客户。我使用了一个下拉框来列出客户 ID。当我选择 id, 1 ~ 3 时,表示更新了 0 行。它仅在我选择 id, 4 时才有效。所以我只能更新第 4 个。有人可以查看我的代码并就问题所在以及如何解决问题给我一些提示吗?谢谢!

这里是“updatecustomer.php”代码:

    <?php
//Turn on error reporting
ini_set('display_errors', 'On');
//Connects to the database
$mysqli = new mysql(SERVER_NAME, USERNAME,PASSWORD, DATABASE);
if($mysqli->connect_errno){
    echo "Connection error " . $mysqli->connect_errno . " " . $mysqli->connect_error;
}


if(!($stmt = $mysqli->prepare("UPDATE customer SET fName=?, lName=?, email=?, phone_number=?, address_no=?, address_street1=?, 
    address_street2=?, address_city=?, address_state=?, address_zip=? WHERE customer_id = ?"))){
    echo "Prepare failed: "  . $stmt->errno . " " . $stmt->error;
}

if(!($stmt->bind_param("isssiissssi",$_POST['customer_id'],$_POST['fName'],$_POST['lName'],$_POST['email'],$_POST['phone_number'], $_POST['address_no'],
    $_POST['address_street1'],$_POST['address_street2'],$_POST['address_city'],$_POST['address_state'], $_POST['address_zip']))){
    echo "Bind failed: "  . $stmt->errno . " " . $stmt->error;
}
if(!$stmt->execute()){
    echo "Execute failed: "  . $stmt->errno . " " . $stmt->error;
} else {
    echo "Updated " . $stmt->affected_rows . " rows to customer.";
}

?>

这是我表单中的部分代码:

<div>
            <form method="post" action="updatecustomer.php">
                <fieldset>
                    <legend>Update Existing Customer</legend>
                    <li>Customer ID:
                        <select name="customer_id">
        <?php
        if(!($stmt = $mysqli->prepare("SELECT customer_id, customer_id FROM customer"))){
            echo "Prepare failed: "  . $stmt->errno . " " . $stmt->error;
        }

        if(!$stmt->execute()){
            echo "Execute failed: "  . $mysqli->connect_errno . " " . $mysqli->connect_error;
        }
        if(!$stmt->bind_result($customer_id, $customer_id)){
            echo "Bind failed: "  . $mysqli->connect_errno . " " . $mysqli->connect_error;
        }
        while($stmt->fetch()){
            echo '<option value=" '. $customer_id . ' "> ' . $customer_id . '</option>\n';
        }
        $stmt->close();
        ?>
                        </select>
                    </li>
                    <li>First Name: <input type="text" name="fName"> Last Name: <input type="text" name="lName"</li>
                    <li>Email Address: <input type="text" name="email"></li>
                    <li>Phone Number: <input type="text" name="phone_number"></li>
                    <li>Street Number: <input type="text" name="address_no"> Street Line 1: <input type="text" name="address_street1"></li>
                    <li>Street Line 2 (Apt or Unit Number): <input type="text" name="address_street2"></li>
                    <li>City: <input type="text" name="address_city"> State: <input type="text" name="address_state"> Zip: <input type="text" name="address_zip"> </li>
                </fieldset>
                <input type="submit" name="update" value="Update Customer">
                <input type="submit" name="delete" value="Delete Customer">
        </div>

【问题讨论】:

  • 您可能想从您的问题中删除用户名和密码...
  • 我怀疑这是问题所在,但它不会造成任何伤害(可以吗?:-))更改您的代码,以便您只获得一次 customer_id 列并且只绑定$customer_id 变量一次。
  • 在您的 bind_param() 方法中,您将第一个占位符绑定到客户 ID,而它实际上是名字。您应该最后绑定 customer_id。

标签: php mysqli sql-update


【解决方案1】:

检查$stmt-&gt;bind_param 行中变量的顺序。

【讨论】:

    【解决方案2】:

    试试这个:我使代码更简洁,更容易理解,并在bind_param() 方法中重新排序了客户 ID。

    $stmt = $mysqli->prepare("
        UPDATE customer 
        SET fName=?, 
            lName=?, 
            email=?, 
            phone_number=?, 
            address_no=?, 
            address_street1=?, 
            address_street2=?, 
            address_city=?, 
            address_state=?, 
            address_zip=? 
         WHERE customer_id = ?
    ");
    
    if(!$stmt){
        echo "Prepare failed: "  . $stmt->errno . " " . $stmt->error;
    }
    
    $paramBinding = $stmt->bind_param("sssiissssii",
                          $_POST['fName'], 
                          $_POST['lName'], 
                          $_POST['email'], 
                          $_POST['phone_number'], 
                          $_POST['address_no'],
                          $_POST['address_street1'], 
                          $_POST['address_street2'], 
                          $_POST['address_city'], 
                          $_POST['address_state'], 
                          $_POST['address_zip'],
                          $_POST['customer_id']
    );
    
    if(!$paramBinding){
        echo "Bind failed: "  . $stmt->errno . " " . $stmt->error;
    }
    

    编辑 然后在循环选项时:

    foreach($stmt->fetch() AS $row){
        echo '<option value="'. $row['customer_id'] . '"> ' . $row['customer_id'] . '</option>\n';
    }
    

    【讨论】:

    • 感谢您的提示。我更改了代码,但现在我只能更新 ID #1 的客户。即使我选择 ID #2 或 #3,更改也只会反映在 ID#1 上。您能否就问题可能给我提供更多提示?
    • 我已经更新了代码,我只做了一个改动,将bind_param()方法的第一个参数中的isssiissssi改为sssiissssii。你能试试吗?
    • 我试过了,但我不明白为什么我所做的所有更改都显示在 ID#1 中,而不是其他 ID #s。
    • 是否有可能是我在为客户 ID 创建的下拉框中做错了什么?抱歉,我想我遗漏了一些东西,但我不知道那会是什么。
    • 不敢相信我以前没见过!我已经用适当的循环更新了我的答案以创建选项。试试看
    猜你喜欢
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2013-10-22
    • 2012-02-02
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多