#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:
В этом скрипте есть некоторые нелогичные вещи.
-
Вы выбираете ВСЕ из хранилища (* равно всем полям). Это очень, очень дорого. Если вы хотите использовать это, вы должны использовать SELECT COUNT (идентификатор) Из хранилища.
-
Вы используете count для ОГРАНИЧЕНИЯ. Но ограничение всегда будет таким же, как количество строк. Что делает ОГРАНИЧЕНИЕ неактуальным?
-
Вы не должны использовать 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(). но в данном конкретном случае это поможет