我已经尝试了一切,我仍然无法弄明白。 addslahes()
,str_replace()
,htmlentities()
,我无法理解为什么双引号没有显示在我的网站上。
$sql = $con->prepare("SELECT * FROM `user_settings` WHERE `user_session` = '$user_session'");
$sql -> execute();
$result = $sql->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $row) {
$advertising_1 = $row['advertising_1'];
$advertising_2 = $row['advertising_2'];
$website_name = $row['website_name'];
$website_url = $row['website_url'];
$statistics = $row['statistics'];
}
echo '<input type="text" name="website_name" placeholder="Your Website URL" value="'. $website_name. '" />' ?>
有人可以解释我在哪里出错吗?问题出现在我的字符串中的双引号。单引号用mysql_escape修复,但似乎已被弃用。
答案 0 :(得分:3)
您需要将输出的数据转义为浏览器使用htmlspecialchars并使用引号常量(ENT_QUOTES),以便将所有引号转换为实体。请注意,这也是如何防止/执行XSS注射。
表示元素/属性在它们不是假设的情况下被关闭。echo htmlspecialchars('Encode all of these "test" test \'test \'', ENT_QUOTES);
输出:
Encode all of these "test" test 'test '
并在浏览器中:
对所有这些进行编码&#34;测试&#34;测试&#39;
同样从您显示的代码中,您滥用预备语句。值必须绑定,而不是与查询连接。这样PDO驱动程序将处理引用/转义。如果您继续使用它,这可能会在将来导致类似的问题。还可以打开SQL注入。
有关预准备陈述的更多信息,请参阅:http://php.net/manual/en/pdo.prepared-statements.php
答案 1 :(得分:0)
您需要在语句上使用不带变量的准备,然后将它们作为数组添加到 execute() 中,如下所示:
$sql ="SELECT * FROM `user_settings` WHERE `user_session` = ?";
$stmt = $con->prepare($sql);
$stmt->execute([$user_session]);