【问题标题】:Updating a single MySQL row更新单个 MySQL 行
【发布时间】:2015-04-21 13:22:48
【问题描述】:

我有一个显示 MySQL 表内容的表。我为每一行添加了一个“编辑按钮”,以便我们的用户可以更新内容。 “编辑按钮”转到链接 ?edit_entry.php?sid=4 ,其中 4 是条目的 sid。

这可行,但我得到一个空白表格。
问题一:有没有什么办法已经在表单的文本字段中显示特定 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) Not updated 消息。
问题 2:有人看到这里的问题吗?
我一直在尝试一些事情来解决这个问题,但都没有奏效。 谢谢

【问题讨论】:

    标签: php html mysql sql forms


    【解决方案1】:

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

    <?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 的新手,可以使用更多解释性/介绍性文本,也许还有示例,但主要是为我提供正在发生的事情的概述......无论如何,感谢所有帮助!

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的回复。不幸的是,这似乎不起作用。我尝试稍微更改您的代码:删除 ud_ 在 UPDATE 命令 SET ..q1_... q2_... 等 WHERE;而且我不明白 bind_param 语句中的“ssssiddsi”应该是什么。
      • s= 字符串,i= 整数。 d=双倍。因此,如果您显示表格的真实结构,我们可以正确设置类型,或者您可以尝试对所有参数使用sssssssss 字符串
      • 检查我的答案中的更新。尝试获取错误列表。你有什么错误É
      • 我尝试了更新但得到一个空白屏幕。可能是因为我的 mysql 表中有更多列吗? (也是时间戳和登录会话用户名)
      【解决方案3】:

      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

      【讨论】:

      • 感谢您的回复。我更新了 $sid 的 (int) 部分。我无法通过使用 $result = $conn->real_escape_string($sql); 让它工作。我将在下面发布我的代码,现在似乎确实更新了 SQL 表,但使用 $result = $conn->query($sql);
      • 好吧,我发现了如何在面向对象的 mysqli 中正确使用真正的转义字符串 :-) $q1_requested_by = $conn->real_escape_string($_POST['q1_requested_by']);
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      相关资源
      最近更新 更多