Попытка встроить Youtube видео, используя URL-ссылку с PHP и подготовленным заявлением - PullRequest
0 голосов
/ 26 октября 2018

У меня есть следующий метод, который я использую для встраивания видео 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 больше не работают. С регулярным заявлением они вводят в дБ, как это:

<br><iframe width='420' height='315' src='https://www.youtube.com/embed/0EqINqnEa-Y'></iframe><br>

С подготовленным утверждением я получаю это в дБ, а затем, очевидно, ошибку на странице.

<br><iframe frameborder=\'0\' style=\'visibility:visible; border: 1px solid #fff;\' width=\'590\' height=\'315\' src=\'https://www.youtube.com/embed/f_WqYtj1Wik\'></iframe>

Есть мысли о том, как это исправить?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Если вы обновите свой вопрос, чтобы показать исходные данные, я постараюсь предоставить более чистый способ извлечения URL-адресов YouTube.До тех пор вот мой рекомендуемый код, начинающийся с изолированной строки 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 является назначенной переменной для получения преобразованных данных.
  • Вы можете получить доступ к идентификатору видео с помощью клавиши v из $array.
  • Я удалил вызов stmt_init()потому что я предпочитаю делать меньше вызовов в моем скрипте.
  • Поскольку только действительно необходимо заполнять и привязывать небезопасные и потенциально нестабильные значения, я призываю вас упростить подготовленное утверждение.
    • Жесткий код значений no и 0.
    • Используйте NULL для столбца AUTOINCREMENT.
    • Как я уже сказал в своем комментарии, лучшая практика будет означать, чтоВы должны хранить только идентификатор видео в своей таблице базы данных для уменьшения использования памяти и повышения удобства обслуживания данных.
    • Используйте NOW() для date_added (при условии, что вы храните штамп DATETIME).
  • Я встроил некоторые условные обозначения для удобной отладки.
  • Обязательно поддерживайте объектно-ориентированный синтаксис при извлечении insert_id.
0 голосов
/ 26 октября 2018

Вы все неправильно храните! Вам не нужна вся эта ерунда в вашей БД, только идентификатор видео:

<?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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...