1

変数をMySQLデータベースに保存するPHPのフォームがあります。このフォームはVPSで機能しましたが、別のVPSで試行すると、フィールドに'文字が含まれているときにデータベースに書き込もうとするとエラーが発生します。したがって、フィールドに'文字が含まれている場合、同じPHPコードは1つのVPSで機能しますが、他のVPSでは機能しません。

ここで動作します:http ://www.zoekmachineoptimalisatie.us/test.php そしてここ(それは他のVPSです)それはエラーを出します:http ://www.onzebruidsfotograaf.nl/test.php

私のフォーム:

<?php
$hostname = "localhost"; //host name
$dbname   = "xxxxxxxx"; //database name
$username = "xxxxxxxx"; //username you use to login to php my admin
$password = "xxxxxxxx"; //password you use to login
$conn     = new MySQLi($hostname, $username, $password, $dbname);

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>Untitled Document</title>
</head>
<body>
<?php
if (isset($_POST['Submit'])) { //if the submit button is clicked

    $title  = $_POST['updatetitle'];
    $bookid = 1;
    $update = "UPDATE test SET Title='$title' WHERE BookID = " . $bookid;

    $conn->query($update) or die("Cannot update"); //update or error
}
?>


<?php
$bookid = 1;
$sql    = "SELECT * FROM test WHERE BookID = '" . $bookid . "'";
$result = $conn->query($sql) or die(mysql_error());
$query = getenv(QUERY_STRING);
parse_str($query);
?>

<h2>Update Record <?php echo $bookid;?></h2>

<form action="" method="post">
    <?php

    while ($row = $result->fetch_assoc()) {
        ?>

        <textarea name="updatetitle" cols="100" rows="30"><?php echo $row['Title']; ?></textarea>

        <table border="0" cellspacing="10">

            <tr>
                <td><INPUT TYPE="Submit" VALUE="Update the Record" NAME="Submit"></td>
            </tr>
        </table>
        <?php
    }
    ?>
</form>

<?php
if ($update) { //if the update worked

    echo "<b>Update successful!</b>";

}
?>
</body>
</html>
4

2 に答える 2

1

クエリでエスケープされていない引用符を使用すると、構文エラーが発生します。SQLを完全に独自に構築する代わりに、プリペアドステートメントを使用してPHP変数にSQL変数を使用します。

if (isset($_POST['Submit'])) { //if the submit button is clicked

    $title  = $_POST['updatetitle'];
    $bookid = 1;

    $update = $conn->prepare('UPDATE test SET Title = ? WHERE BookID = ?;');
    $update->bind_param('sd', $title, $bookid);
    $update->execute();
}

サーバーの1つでMagicQuotesが有効になっていて、もう1つでは有効になっていない。Magic Quotesは現在望ましくないと見なされて非推奨になり、入力を自動的にエスケープします。Magic Quotesをオフにし、代わりにパラメーター化されたクエリ/プリペアドステートメントを使用する必要があります。そうすれば、何もエスケープする必要がなく、SQLインジェクションが妨げられます。

パラメータ化されたクエリは、 MySQLiおよびPDOAPIでサポートされています。

于 2012-12-17T15:16:27.953 に答える
0

一重引用符はクエリステートメントを壊すためです。それを防ぐために、またはSQL Injectionあなたが使用PDOまたはMySQLI拡張する必要があります。詳細については、以下の記事を参照してください

于 2012-12-17T15:15:28.813 に答える