1

我有一个带有 PHP 的表单,可以将变量保存到 MySQL 数据库中。该表单在 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,不如通过Prepared Statement为 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();
}

您的一台服务器启用了Magic Quotes,而另一台则没有。Magic Quotes 现在被认为是不可取的并且已被弃用,它会自动转义输入。您应该关闭 Magic Quotes 并改用参数化查询/准备语句 - 这样就不需要转义任何东西,它可以防止 SQL 注入。

MySQLi和 PDO API支持参数化查询。

于 2012-12-17T15:16:27.953 回答
0

因为单引号会破坏查询语句。为了防止它或SQL Injection您需要使用PDOMySQLI扩展。有关更多信息,请参阅下面的文章

于 2012-12-17T15:15:28.813 回答