如何使用预准备语句来更新表而不是未准备好的表单

时间:2015-07-19 06:16:30

标签: php mysqli

update1:​​我尝试了所有的建议(非常感谢btw),但执行仍然没有经历显示"更新了0行"。我已经尝试了多种方法来解决这个问题但似乎对我没有任何帮助。

这是我目前的代码:

    if(isset($_POST['Done'])) {

        $updateCD = "UPDATE users SET lgs=?, its=?, hbs=?, bios=?, pls=?, cts=? WHERE email=?";
        $stmt = $con->prepare($updateCD);

        $stmt->bind_param('sssssss', $_POST['lgs'], $_POST['its'], $_POST['hbs'], $_POST['bios'], $_POST['pls'], $_POST['cts'], $_GET['email']);
        $stmt->execute();

          if ($stmt->errno) {
     echo "FAILURE!!! " . $stmt->error;
      }
   else {
    echo "Updated {$stmt->affected_rows} rows";

      $stmt->close();

     }

         }

我希望通过用预准备语句替换我的基本sqli查询来提高代码的安全性。

此UPDATE语句涉及更新数据库中用户的配置文件信息。问题是,尽管我遵循的模型,更新执行没有通过,因此在数据库中没有任何改变。

PHP代码:

    $email_login = mysqli_real_escape_string($con, $GET['email']);
    $lg = mysqli_real_escape_string($con, $_POST['lgs']);
     $it = mysqli_real_escape_string($con, $_POST['its']);
     $hb = mysqli_real_escape_string($con, $_POST['hbs']);
     $bio = mysqli_real_escape_string($con, $_POST['bios']);
     $pl = mysqli_real_escape_string($con, $_POST['pls']);
    $ct = mysqli_real_escape_string($con, $_POST['cts']);

    if(isset($_POST['Done'])) {
     $updateCD = "UPDATE users SET lgs=?, its=?, hbs=?, bios=?, pls=?, cts=? WHERE email=?";
     $stmt = $con->prepare($updateCD);

        $stmt->bind_param('sssssss', $lg, $it, $hb, $bio, $pl, $ct, $email_login);
      $stmt->execute();

      if ($stmt->errno) {
     echo "FAILURE!!! " . $stmt->error;
      }
   else {
    echo "Updated {$stmt->affected_rows} rows";

      $stmt->close();

     }

         }

关闭后的注意事项:我理解为什么看起来好像这个问题与另一个问题相似,但绝不是完全重复。引用的问题涉及一般更新表,而这个问题放大了使用预准备语句来执行更新。我已经知道如何在不使用预准备语句的情况下更新表,因此我希望使用更可靠的框架集来改进我的代码语法。虽然这两个问题都是相关的,但它们的范围不同。

1 个答案:

答案 0 :(得分:1)

您的$email_login变量为空;即使它是通过GET获得的,您也必须使用$_GET,而不是$GET

如各种评论中所述,不要使用mysqli_real_escape_string,因为可靠的转义是由MySQLi本身完成的。只需将$_POST变量直接作为bind_param的参数传递。

其他一些想法: