0

我试图从 mysql 迁移到 mysqli,但这段代码不起作用。我是 php 和 mysql 的新手

$link = mysqli_connect("localhost", "user", "password", "db");

/* check connection */ 
if (mysqli_connect_errno()) { printf("Connect failed: %s\n", 
mysqli_connect_error()); exit(); }

if ($result = mysqli_query($link, "SELECT * FROM users WHERE uid='$uid'")) {

if(mysqli_num_rows($result) != 0) {

mysqli_query($link, "UPDATE users SET array='$array' WHERE uid='$uid'");

}
else {mysqli_query($link, "INSERT INTO users (uid,array) VALUES ('$uid','$array')"); }

mysqli_free_result($result); }

/* close connection */ 
mysqli_close($link);
?>

所以我的问题是:

  1. 应该改变什么来使这个代码工作;
  2. 此代码有哪些安全漏洞,您会建议对代码进行哪些更改来修复它?

感谢您花时间回答我的问题。

4

1 回答 1

0
  1. 您需要将错误报告设置为最高级别并提供错误消息。这样,您将让 PHP 告诉您出了什么问题以及需要修复什么。

    • 但是,有时我们的代码仍然无法工作,但周围没有错误消息。是时候进行一些调试了
  2. 您必须更改此代码以使每个变量仅通过占位符进入查询

但是,原始 mysqli 对准备好的语句非常不利,因此,我建议不要使用它,而是转向PDOsafeMysql。后一种可以让您使用相同数量的代码进行安全查询。

if ($db->getOne("SELECT 1 FROM users WHERE uid=?i",$uid))
{
    $db->query("UPDATE users SET array=?s WHERE uid=?i",$array,$uid);

} else {

    $db->query("INSERT INTO users (uid,array) VALUES (?i,?s)",$uid,$array);
}

顺便说一句,Mysql 允许您将所有这三个查询合二为一

$sql = "INSERT INTO users (uid, array) VALUES (?i,?s) 
        ON DUPLICATE KEY UPDATE array=values(array)";
$db->query($sql, $uid, $array);
于 2013-05-31T08:47:16.767 回答