尝试使用 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 值,所以我鼓励您简化准备好的语句。
    • 硬编码 no0 值。
    • 对 AUTOINCREMENT 列使用 NULL
    • 正如我在评论中所说,最佳实践表明您应该只将视频 ID 存储在数据库中 table 以减少内存使用并提高数据可维护性。
    • date_added 使用 NOW()(假设您正在存储 DATETIME 戳)。
  • 为了方便调试,我内置了一些条件。
  • 获取 insert_id.
  • 时务必保持面向对象的语法