【发布时间】:2018-10-26 09:06:33
【问题描述】:
我使用以下方法在我的页面上嵌入 Youtube 视频:
$body = strip_tags($body); //removes html tags
// $body = mysqli_real_escape_string($this->con, $body);
$check_empty = preg_replace('/\s+/', '', $body); //Deletes all spaces
if($check_empty != "") {
$body_array = preg_split("/\s+/", $body);
foreach ($body_array as $key => $value) {
if(strpos($value, "www.youtube.com/watch?v=") !== false) {
$link = preg_split("!&!", $value);
$value = preg_replace("!watch\?v=!", "embed/", $link[0]);
$value = "<br><iframe frameborder=\'0\' style=\'visibility:visible; border: 1px solid #fff;\' width=\'590\' height=\'315\' src=\'" . $value ."\'></iframe>";
$body_array[$key] = $value;
}
}
$body = implode(" ", $body_array);
这是我用来输入数据库的:
$query = mysqli_query($this->con, "INSERT INTO posts VALUES('', '$body', '$added_by', '$user_to', '$date_added', 'no', 'no', '0', '$imageName')");
$returned_id = mysqli_insert_id($this->con);
当我将查询更改为这样的准备语句时:
$no = 'no';
$zero = 0;
$empty = '';
$query = $this->con->stmt_init();
$query->prepare("INSERT INTO posts VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
$query->bind_param('issssssis', $empty, $body, $added_by, $user_to, $date_added, $no, $no, $zero, $imageName);
$query->execute();
$returned_id = mysqli_insert_id($this->con);
$query->close();
我的 Youtube 链接不再有效。使用常规语句,他们像这样输入 dB:
<br><iframe width='420' height='315' src='https://www.youtube.com/embed/0EqINqnEa-Y'></iframe><br>
使用准备好的语句,我在 dB 中得到了这个,然后页面上显然出现了错误。
<br><iframe frameborder=\'0\' style=\'visibility:visible; border: 1px solid #fff;\' width=\'590\' height=\'315\' src=\'https://www.youtube.com/embed/f_WqYtj1Wik\'></iframe>
关于如何纠正这个问题的任何想法?
【问题讨论】:
-
我意识到了,但是这些不需要转义吗?这个想法是让 $body 值安全地进入数据库。
-
他们不应该从一开始就被转义 - 而不是在那个地方。应该使用 适当的 函数处理数据,以使其安全地插入 SQL 查询 - 本来应该是
mysqli_real_escape_string。但是使用正确使用占位符然后将值绑定到之后的准备好的语句,转义数据的步骤不再需要 - 因为语句语法和数据在第一次没有混合在一起地点。 -
你可以看到在前面的查询中我使用了
mysqli_real_escape_string,但是当我切换到准备好的语句时我把它注释掉了。但是单独的mysqli_real_escape_string没有处理插入的数据显示什么。它需要转义才能显示。 -
但是在准备好的时候是的,没有必要也没有'
mysqli_real_escape_string。 -
@Raylene 我可以建议您不要在数据库中存储大量 HTML 吗?它不仅会用大部分冗余数据填充您的数据库表,而且如果您只保存视频 id 字符串,那么您将来可以非常简单地管理数据的显示(以防您想调整
<iframe>或其他东西的大小。如果您显示您的原始输入,我想看看我是否可以向您展示一种更直接的方法来提取视频 ID 并优化您的代码。
标签: php mysqli youtube prepared-statement