正在更新单个MySQL行


Updating a single MySQL row

我有一个表,显示MySQL表的内容。对于每一行,我都添加了一个"编辑按钮",这样我们的用户就可以更新内容。"编辑按钮"指向链接?edit_entry.php?sid=4,其中4是条目的sid。

这很有效,但我得到了一张空白表格。
问题1:是否有任何方法可以在表单的文本字段中显示特定MySQL行的内容

这是edit_entry.php代码:

<?php require('includes/config.php'); 
//if not logged in redirect to login page
if(!$user->is_logged_in()){ header('Location: login.php'); } 
// Create connection
$conn = new mysqli(DBHOST, DBUSER, DBPASS, DBNAME);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
$sid = $_GET['sid'];
$sql = "SELECT * FROM orders WHERE sid = '$sid'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
    while($row = mysqli_fetch_array($sql)) {
        $sid = $row['sid'];
        $q1_requested_by = $row['q1_requested_by'];
        $q2_productname = $row['q2_productname'];
        $q3_supplier = $row['q3_supplier'];
        $q4_productnumber = $row['q4_productnumber'];
        $q5_quantity = $row['q5_quantity'];
        $q6_price = $row['q6_price'];
        $q7_budget = $row['q7_budget'];
        $q8_link = $row['q8_link'];
    }
?>
<form action="update_script.php" method="post">
<input type="hidden" name="sid" value="<?=$sid;?>">
Requested by: <input id="q1" type="text" style="width:400px" name="ud_q1_requested_by" value="<?=$q1_requested_by?>" required="true" tabindex="1"><br>
Product name: <input id="q2" type="text" style="width:400px" name="ud_q2_productname" value="<?=$q2_productname?>" required="true" tabindex="2"><br>
Supplier: <input id="q3" type="text" style="width:400px" name="ud_q3_supplier" value="<?=$q3_supplier?>" required="true" tabindex="3"><br>
Product number: <input id="q4" type="text" style="width:400px" name="ud_q4_productnumber" value="<?=$q4_productnumber?>" required="true" tabindex="4"><br>
Quantity: <input id="q5" type="text" style="width:400px" name="ud_q5_quantity" value="<?=$q5_quantity?>" required="true" tabindex="5"><br>
Price: <input id="q6" type="text" style="width:400px" name="ud_q6_price" value="<?=$q6_price?>" tabindex="6"><br>
Budget: <input id="q7" type="text" style="width:400px" name="ud_q7_budget" value="<?=$q7_budget?>" tabindex="7"><br>
Link: <input id="q8" type="text" style="width:400px" name="ud_q8_link" value="<?=$q8_link?>" tabindex="8"><br>
<input type="submit" name="submit" id="submit" value="Update your input!" tabindex="9" />
</form>
<?php
}else{
    echo 'No entry found. <a href="javascript:history.back()">Go back</a>';
}
?>

这里是update_script.php:

<?php require('includes/config.php'); 
 //if not logged in redirect to login page
 if(!$user->is_logged_in()){ header('Location: login.php'); } 
 // Create connection
 $conn = new mysqli(DBHOST, DBUSER, DBPASS, DBNAME);
 // Check connection
 if ($conn->connect_error) {
     die("Connection failed: " . $conn->connect_error);
 }

$sid = $_POST["sid"];
$ud_q1_requested_by = mysqli_real_escape_string($_POST["ud_q1_requested_by"]);
$ud_q2_productname = mysqli_real_escape_string($_POST["ud_q2_productname"]);
$ud_q3_supplier = mysqli_real_escape_string($_POST["ud_q3_supplier"]);
$ud_q4_productnumber = mysqli_real_escape_string($_POST["ud_q4_productnumber"]);
$ud_q5_quantity = mysqli_real_escape_string($_POST["ud_q5_quantity"]);
$ud_q6_price = mysqli_real_escape_string($_POST["ud_q6_price"]);
$ud_q7_budget = mysqli_real_escape_string($_POST["ud_q7_budget"]);
$ud_q8_link = mysqli_real_escape_string($_POST["ud_q8_link"]);
$sql= "UPDATE orders
    SET q1_requested_by = '$ud_q1_requested_by', q2_productname = '$ud_q2_productname', ud_q3_supplier = '$ud_q3_supplier', ud_q4_productnumber = '$ud_q4_productnumber', ud_q5_quantity = '$ud_q5_quantity', ud_q6_price = '$ud_q6_price', ud_q7_budget = '$ud_q7_budget', ud_q8_link = '$ud_q8_link'
    WHERE sid='$sid'";
$result = $conn->query($sql);

if(mysqli_affected_rows()>=1){
    echo "<p>($sid) Record Updated<p>";
}else{
    echo "<p>($sid) Not Updated<p>";
}
?>

最后一部分肯定有问题,因为我收到了(4)未更新的消息
问题2:有人看到这里的问题吗
我一直在尝试一些方法来解决这个问题,但都不起作用。感谢

mysqli_real_escape方法需要提供连接;不推荐使用的mysqli*方法并非如此。。

请参阅上的文档http://php.net/manual/en/mysqli.real-escape-string.php

在您的情况下,由于您使用的是mysqli:的对象

$conn->real_escape_string($string)

同样为了记录,你有一个可能的注入,尽管你试图不。

如果$sid = $_POST["sid"];应该是一个整数,则应该将其更新为$sid = (int) $_POST["sid"];,或者对其进行转义。

然而,由于有这么多变量需要转义,您可能应该研究如何执行准备好的语句。http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

您使用的是mysqli,而不是mysql,这是个好消息。

但您仍然使用旧的技术将参数传递给查询。

因此,让我们试着绑定参数,就像应该使用mysqli:一样

$sql= "UPDATE orders
    SET 
    q1_requested_by = ? , 
    q2_productname = ?, 
    ud_q3_supplier = ?, 
    ud_q4_productnumber = ?, 
    ud_q5_quantity = ?, 
    ud_q6_price = ?, 
    ud_q7_budget = ?, 
    ud_q8_link = ?
    WHERE sid=? ";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ssssiddsi', $ud_q1_requested_by, $ud_q2_productname, $ud_q3_supplier, $ud_q4_productnumber, $ud_q5_quantity, $ud_q6_price, $ud_q7_budget, $ud_q8_link, $sid);
$result = $stmt->execute();
if($result && $stmt->affected_rows>0){
    echo "<p>($sid) Record Updated<p>";
}else{
    echo "Error:'n";
    print_r($stmt->error_list);
    echo "<p>($sid) Not Updated<p>";
}

我使用以下代码使其工作:

<?php require('includes/config.php'); 
 //if not logged in redirect to login page
 if(!$user->is_logged_in()){ header('Location: login.php'); } 
$conn = new mysqli(DBHOST, DBUSER, DBPASS, DBNAME);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
    $sid = (int)$_POST["sid"];
    $ud_q1_requested_by = $conn->real_escape_string($_POST["ud_q1_requested_by"]);
    $ud_q2_productname = $conn->real_escape_string($_POST["ud_q2_productname"]);
    $ud_q3_supplier = $conn->real_escape_string($_POST["ud_q3_supplier"]);
    $ud_q4_productnumber = $conn->real_escape_string($_POST["ud_q4_productnumber"]);
    $ud_q5_quantity = $conn->real_escape_string($_POST["ud_q5_quantity"]);
    $ud_q6_price = $conn->real_escape_string($_POST["ud_q6_price"]);
    $ud_q7_budget = $conn->real_escape_string($_POST["ud_q7_budget"]);
    $ud_q8_link = $conn->real_escape_string($_POST["ud_q8_link"]);

    $sql= "UPDATE orders
            SET 
            q1_requested_by = '$ud_q1_requested_by', 
            q2_productname = '$ud_q2_productname', 
            q3_supplier = '$ud_q3_supplier', 
            q4_productnumber = '$ud_q4_productnumber', 
            q5_quantity = '$ud_q5_quantity', 
            q6_price = '$ud_q6_price', 
            q7_budget = '$ud_q7_budget', 
            q8_link = '$ud_q8_link'
            WHERE sid='$sid'";
    $result = $conn->query($sql);

header("Location: edit_orders.php");
 ?>

这只是一个简单的查询,就像输入新行数据的原始表单一样。我还决定在最后删除错误处理,因为它似乎不适用于mysqli_affected_rows()>0…

这可能不是一个非常优雅的解决方案,但它确实有效。尽管如此,我还是想了解更多,所以如果有人能有一个有用的链接来解释php+mysqli的基础知识,那将对我有很大帮助。不过,目前到php.net或mysql.com的链接对我来说太简短了,对我来说,它们并没有解释发生了什么。我是php和mysql的新手,可以使用一些更具解释性/介绍性的文本,也许还有示例,但主要是为我提供了正在发生的事情的概述…无论如何,感谢所有的帮助!