尝试使用 URL link 和 PHP & Prepared Statement 嵌入 Youtube 视频
Trying to embed Youtube Video using URL link with PHP & Prepared Statement
我使用以下方法在我的页面上嵌入 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>
关于如何纠正这个问题有什么想法吗?
你存储的全错了!您不需要数据库中的所有这些废话,只需要视频 ID:
<?php
$body = 'https://www.youtube.com/watch?v=h2v5jh9hy-Y';
$body = parse_url($body);
parse_str($body['query'], $query);
// This is what should go in your DB
$video = $query['v'];
// And here's how you output it
echo '<br><iframe width="420" height="315" src="https://www.youtube.com/embed/' . $video . '"></iframe><br>';
在这里查看:https://3v4l.org/kdAq4
如果您更新问题以显示原始输入数据,我会尝试为您提供一种更简洁的方式来提取 youtube urls。在那之前,这是我推荐的代码,从一个孤立的 url 字符串开始:
$url = "www.youtube.com/watch?v=0EqINqnEa-Y";
$query = parse_url($url, PHP_URL_QUERY);
parse_str($query, $array);
$video = $array['v'];
if (!$stmt = $this->con->prepare("INSERT INTO posts VALUES (NULL, ?, ?, ?, NOW(), 'no', 'no', 0, ?)")) { // NULL for AUTOINCREMENT
echo "Stmt Preparation Error"; // $this->con->error
} elseif (!$stmt->bind_param('ssss', $video, $added_by, $user_to, $imageName)) { // store video id, not html
echo "Param Binding Error"; // $stmt->error
} elseif (!$stmt->execute()) {
echo "Stmt Execution Error"; // $stmt->error
} else {
$returned_id = $this->con->insert_id; // maintain object-oriented syntax
$stmt->close();
}
parse_url()
带有 PHP_URL_QUERY
标志将从 url 查询生成一个字符串(?
之后的所有内容)。
parse_str()
会将查询字符串转换为数组。 $array
是接收转换数据的指定变量。
- 您可以通过
$array
中的 v
键访问视频 ID。
- 我删除了
stmt_init()
调用,因为我更喜欢在我的脚本中进行更少的调用。
- 因为只有真正需要占位符和绑定不安全且可能不安全的 table 值,所以我鼓励您简化准备好的语句。
- 硬编码
no
和 0
值。
- 对 AUTOINCREMENT 列使用
NULL
。
- 正如我在评论中所说,最佳实践表明您应该只将视频 ID 存储在数据库中 table 以减少内存使用并提高数据可维护性。
- 对
date_added
使用 NOW()
(假设您正在存储 DATETIME 戳)。
- 为了方便调试,我内置了一些条件。
- 获取
insert_id
. 时务必保持面向对象的语法
我使用以下方法在我的页面上嵌入 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>
关于如何纠正这个问题有什么想法吗?
你存储的全错了!您不需要数据库中的所有这些废话,只需要视频 ID:
<?php
$body = 'https://www.youtube.com/watch?v=h2v5jh9hy-Y';
$body = parse_url($body);
parse_str($body['query'], $query);
// This is what should go in your DB
$video = $query['v'];
// And here's how you output it
echo '<br><iframe width="420" height="315" src="https://www.youtube.com/embed/' . $video . '"></iframe><br>';
在这里查看:https://3v4l.org/kdAq4
如果您更新问题以显示原始输入数据,我会尝试为您提供一种更简洁的方式来提取 youtube urls。在那之前,这是我推荐的代码,从一个孤立的 url 字符串开始:
$url = "www.youtube.com/watch?v=0EqINqnEa-Y";
$query = parse_url($url, PHP_URL_QUERY);
parse_str($query, $array);
$video = $array['v'];
if (!$stmt = $this->con->prepare("INSERT INTO posts VALUES (NULL, ?, ?, ?, NOW(), 'no', 'no', 0, ?)")) { // NULL for AUTOINCREMENT
echo "Stmt Preparation Error"; // $this->con->error
} elseif (!$stmt->bind_param('ssss', $video, $added_by, $user_to, $imageName)) { // store video id, not html
echo "Param Binding Error"; // $stmt->error
} elseif (!$stmt->execute()) {
echo "Stmt Execution Error"; // $stmt->error
} else {
$returned_id = $this->con->insert_id; // maintain object-oriented syntax
$stmt->close();
}
parse_url()
带有PHP_URL_QUERY
标志将从 url 查询生成一个字符串(?
之后的所有内容)。parse_str()
会将查询字符串转换为数组。$array
是接收转换数据的指定变量。- 您可以通过
$array
中的v
键访问视频 ID。 - 我删除了
stmt_init()
调用,因为我更喜欢在我的脚本中进行更少的调用。 - 因为只有真正需要占位符和绑定不安全且可能不安全的 table 值,所以我鼓励您简化准备好的语句。
- 硬编码
no
和0
值。 - 对 AUTOINCREMENT 列使用
NULL
。 - 正如我在评论中所说,最佳实践表明您应该只将视频 ID 存储在数据库中 table 以减少内存使用并提高数据可维护性。
- 对
date_added
使用NOW()
(假设您正在存储 DATETIME 戳)。
- 硬编码
- 为了方便调试,我内置了一些条件。
- 获取
insert_id
. 时务必保持面向对象的语法