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 は準備済みステートメントでは非常に悪いため、使用せずにPDOまたはsafeMysqlに移行することをお勧めします。後者を使用すると、同じ量のコードで安全なクエリを作成できます。

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 を使用すると、これら 3 つのクエリをすべて1 つにまとめることができます。

$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 に答える