Как случайным образом извлекать изображения из моей базы данных mysql?

#php #image #random

#php #изображение #Случайный

Вопрос:

Хорошо, итак, я создал один php-файл для вывода изображений, это пример кода для страницы вывода:

mysql_connect (» «,» «,» «) или умереть (mysql_error()); mysql_select_db (» «) или умереть (mysql_error ());

 $query = mysql_query("SELECT * FROM store"); 
$number=mysql_num_rows($query); 

$result = mysql_query ("SELECT * FROM store ORDER BY RAND() LIMIT $number");

while ($row = mysql_fetch_assoc($result))     
{       
    echo '<img src=get.php?id=$row["id"]>';
}
  

The get.php тег img, на который ссылается, содержит этот код:

mysql_connect (» «,» «,» «) или умереть (mysql_error()); mysql_select_db (» «) или умереть (mysql_error ());

  $id = addslashes ($_REQUEST['id']);


$query = mysql_query("SELECT * FROM store WHERE id= $id ");
$row = mysql_fetch_array($query);
$content = $row['image'];

header('Content-type: image/jpg');
 echo $content;
  

Все, что я получаю, это серию разорванных значков страницы на странице вывода. Возможно, я допустил очень простую ошибку, учитывая, что я все еще изучаю php. Заранее спасибо.

Ответ №1:

Очистка:

 $result = mysql_query("SELECT * FROM store ORDER BY RAND()");

while($row = mysql_fetch_assoc($result)){       
    echo '<img src="get.php?id='.$row[id].'" />';
}
  

Вы также можете echo mysql_error(); посмотреть, есть ли какие-либо ошибки в ваших инструкциях mysql.

Вам также следует использовать mysql_real_escape_string() вместо addslashes()

Или рассмотрите PDO для еще более безопасного решения.

Для отладки перейдите к get.php?id =1. Если вы видите изображение get.php работает, а основной файл — нет.

Вы убедились, что get.php подключается как к базе данных, так и к основному файлу?

Комментарии:

1. когда я ввожу get.php?id=1, оно показывает изображение, но я все еще не понимаю, что я сделал не так с основным файлом.

2. mysql_real_escape_string или addslashes здесь не помогут. хотя подготовленные инструкции будут

3. спасибо, не могли бы вы рассказать мне, почему эти изменения в коде сработали?

4. Очень важно расставлять кавычки в нужных местах (сравните мой тег img с вашим). Уэсли также упомянул, что вам все равно не нужно использовать LIMIT при выборе каждой строки.

Ответ №2:

В этом скрипте есть некоторые нелогичные вещи.

  1. Вы выбираете ВСЕ из хранилища (* равно всем полям). Это очень, очень дорого. Если вы хотите использовать это, вы должны использовать SELECT COUNT (идентификатор) Из хранилища.

  2. Вы используете count для ОГРАНИЧЕНИЯ. Но ограничение всегда будет таким же, как количество строк. Что делает ОГРАНИЧЕНИЕ неактуальным?

  3. Вы не должны использовать addslashes для экранирования ваших значений. Вместо этого используйте mysql_real_escape_string. Проверьте это здесь.

Я не уверен, какие значения есть в вашей базе данных, возможно, вы могли бы опубликовать некоторые? Возможно, вам нужно выполнить косые черты, поскольку вы, вероятно, сохраняете значения с косыми чертами в своей базе данных?

Комментарии:

1. в таблице шесть столбцов: «id», «name», «image», «com», «desc» и «URL». «id» — это тип int, «name» — varchar (50), «image» — это тип BLOB. «com», «desc» и «url» — это все текстовые типы.

2. mysql_real_escape_string поможет здесь не больше, чем добавление косых черт

3. выбор каждого поля не так уж и дорог. однако выбор всех строк является.

4. Я должен был бы не согласиться с этим, возможно, не с точки зрения производительности самого MySQL, но с точки зрения трафика это может быть убийственным на веб-сайтах с высоким трафиком или на больших процессах / сценариях импорта или обновления. И да, конечно, я также указываю на выбор всех строк :). Спасибо за ваш комментарий!

Ответ №3:

Все, что я получаю, это серию разорванных значков страницы на странице вывода.

Фактически, вы создаете своего рода атаку типа «отказ в обслуживании» против вашего сайта, заставляя его запускать десятки PHP-скриптов и открывать десятки sql-подключений за один запрос страницы. Неудивительно, что ваш сервер перегружен таким потоком и не показывает изображений.

Также обратите внимание, что ваш код страдает от SQL-инъекции.
Либо измените addslashes на intval() , либо добавьте кавычки вокруг $ id в запросе (иначе экранирование не будет иметь смысла)

Комментарии:

1. Не могли бы вы объяснить внедрение SQL и «экранирование», пожалуйста? Лечит ли intval () SQL-инъекцию?

2. intval () не имеет ничего общего с инъекциями в целом. отсутствует функция cure_all_injections_for_me(). но в данном конкретном случае это поможет