更新单个MySQL行

时间:2015-02-19 23:46:50

标签: php html mysql sql forms

我有一个显示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:有人在这看到问题吗?
我一直在尝试一些方法来解决这个问题,但两者都没有奏效。 谢谢

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你使用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>";
}

答案 2 :(得分:0)

我使用以下代码让它工作:

<?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()&gt; 0 ...

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