извлекать изображения из нескольких таблиц mysql с помощью php

Последние пару дней я пытался понять, как извлекать данные из нескольких таблиц, но не могу сказать, что полностью понял, как это работает. Так или иначе :)

Что я пытаюсь сделать, так это получить изображения, хранящиеся в нескольких таблицах, с помощью панели поиска, чтобы определить параметры, то есть имя исполнителя (я знаю, что хранение изображения в базе данных может вызвать много проблем, но это упражнение для университета, поэтому я не могу действительно многое с этим делать)

Итак, чтобы быть конкретным сейчас. У меня есть 5 таблиц с именами animaldata , cardata , landscapedata , peopledata и otherdata. Каждая из таблиц имеет следующие поля: 1 id 2 artist_name 3 детали 4 фото 5 фототип и 6 дата. Где artist_name — это имя зарегистрированного человека, который загружает изображение, а details — это подпись, photo — элемент BLOB-объекта, который нужно сохранить, а phototype — это .. ну тип изображения: P

Итак, что я хочу сделать, так это когда кто-то использует панель поиска для поиска исполнителя, код для извлечения и отображения всех изображений из всех таблиц, которые художник загрузил.

Вот код, который я использую для извлечения данных из 1 таблицы, но я не знаю, как его изменить, чтобы искать и в других таблицах.

Это search.php

<?php
mysql_connect ("localhost","root","")  or die (mysql_error());
mysql_select_db ("photo_album_db");

$term = $_POST['term'];

$sql = mysql_query("select * from animaldata where artist_name like '%$term%'");

while ($row = mysql_fetch_array($sql)){
    echo $row['details'];
echo "</br>";
echo "<img src=getan.php?id=".$row['id']." width=250 height=200/>";
echo "</br>";
}
?>

Форма строки поиска следующая: <form action="search.php" method="post"><input type="text" name="term" /><input type="submit" name="search" value="Search" /></form>

Заранее спасибо за любое предложение, если вам нужно больше «подсказок», дайте мне знать :) :) :)


person ekptwtos    schedule 20.05.2012    source источник
comment
Ваш код уязвим для SQL-инъекций. Вам действительно следует использовать подготовленные операторы, в которые вы передаете свои переменные как параметры, которые не оцениваются для SQL. Если вы не понимаете, о чем я говорю или как это исправить, прочитайте историю Bobby Tables.   -  person eggyal    schedule 20.05.2012
comment
Если его профессора попытаются сделать ему SQL-инъекцию, клянусь, я полечу туда и поприветствую этих засранцев!   -  person Mihai Stancu    schedule 20.05.2012


Ответы (2)


Попробуй это:

// set up database connection ... 

$term = my_awesome_sanitizer($_POST['term']);

$tables = array("animaldata", "cardata", "landscapedata", "peopledata", "otherdata");
foreach ($tables as $table)
{
    $sql = mysql_query("select * from $table where artist_name like '%$term%'");
    while ($row = mysql_fetch_array($sql))
    {
        echo $row['details'];
        // show stuff ....
    }
}
person Jannie Theunissen    schedule 21.05.2012
comment
это делает 5 отдельных запросов к базе данных, по крайней мере, объединяет все запросы, чтобы они были отправлены все сразу. - person Mihai Stancu; 22.05.2012
comment
@Mihai Верное замечание, но ОП пытается понять основы, и это решение легче понять и поддерживать с небольшим снижением производительности. - person Jannie Theunissen; 22.05.2012

Для изменения таблицы, если они имеют одинаковые столбцы, используйте:

$sql = mysql_query("select animaldata.artist_name AS animaldata_artist_name, cardata.artist_name AS cardata_artist_name /* do this for all columns in all tables, or mor specifically for the columns you need  */ from animaldata AS a, cardata AS c, landscapedata AS l, peopledata AS p where a.artist_name like '%$term%' OR c.artist_name like '%$term%' OR l.artist_name like '%$term%' OR p.artist_name like '%$term%'");

Попробуйте это для отображения изображений:

<img src="data:image/jpeg;base64,".base64_encode($row['image_blob'])." width...

Это не будет делать отдельный запрос на фото. Он встроит содержимое изображения в HTML.

Этот метод поддерживается протоколом data:uri.

person Mihai Stancu    schedule 20.05.2012
comment
спасибо, я изменил эти вещи, но когда я ищу имя исполнителя, появляется просто пустая страница, на которой ничего нет (но и ошибок нет) - person ekptwtos; 20.05.2012
comment
если вы используете Linux, попробуйте php -l /path/to/file.php, чтобы проверить наличие ошибок синтаксиса/анализа. - person Mihai Stancu; 20.05.2012
comment
Ошибки синтаксиса/анализа не отображаются, если файл, который вы непосредственно посещаете (example.com/page.php) есть. Они отображаются только в том случае, если файл включен. - person Mihai Stancu; 20.05.2012
comment
У меня сейчас нет линукса на компе. Считаете ли вы, что мне следует сделать отдельную php-страницу для извлечения данных и изображений из БД вместо ‹img src=data:image/jpeg;base64,.base64_encode($row['image_blob']). ширина... ? - person ekptwtos; 21.05.2012
comment
хорошо, теперь это работает.. НО, кажется, есть другая проблема.. скажем, я ищу «ekptwtos», и есть 3 изображения животных и 2 изображения людей, он показывает только 2 фотографии последней таблицы (в этом случае люди) - person ekptwtos; 21.05.2012
comment
Запросы на выборку нескольких таблиц действуют так же, как и запросы JOIN, вы должны развернуть селектор *, назвав каждый столбец псевдонимом. - person Mihai Stancu; 21.05.2012
comment
Поскольку вы делаете это для школы, я не думаю, что вам следует создавать отдельную страницу для загрузки изображений, если только у вас нет особых требований, которые необходимо учитывать в отношении изображений. Это ошибка производительности, но в первую очередь это хранение изображений в базе данных. - person Mihai Stancu; 21.05.2012
comment
Я сделал это, но затем я получаю это предупреждение: mysql_fetch_array() ожидает, что параметр 1 будет ресурсом, логическим значением, заданным в c:// blah blah . Он указывает на цикл while. - person ekptwtos; 21.05.2012
comment
когда ожидается ресурс и задано логическое значение, это означает, что вывод mysql_query false, поскольку синтаксический анализ запроса не удался, прежде чем использовать ответ mysql_query, вы должны проверить, не является ли он ложным, и вывести результат mysql_error(). - person Mihai Stancu; 22.05.2012
comment
Предыдущий комментарий означает, что в скрипте есть синтаксическая ошибка. Обычно я тестировал код, прежде чем писать его в ответ. Но так как вы это домашнее задание и вы находитесь в процессе обучения, я думаю, что лучше всего найти причину. - person Mihai Stancu; 22.05.2012