Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - PHP - несколько вопросов

Ответить
Настройки темы
Разное - PHP - несколько вопросов

Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


PHP код: Выделить весь код

<?php 


$tmp_name 
' *math* '// реальный (относительный, а не абсолютный, естессно) адрес файла на сервере
$final_path $tmp_name// копия предыдущей переменной с более красивым именем


if (is_uploaded_file($_FILES['userfile']['tmp_name'])) { // Как поля USERFILE и TMP_NAME берут свои значения? пробовал вписывать вместо tmp_name следующее: $tmp_name и final_path, что приводило к ошибке (если можно, объясни мне синтаксис процедуры is_uploaded_files, я работаю с php5)
   
echo "File "$_FILES['userfile']['name'] ." uploaded successfully.\n"// Как берётся значение NAME? это тоже стандартная переменная... и что значит \n в конце строки??
   
echo "Displaying contents\n";
   
readfile($_FILES['userfile']['tmp_name']); // что делается в этой строке?
} else {
   echo 
"Possible file upload attack: "// Что имеется ввиду под атакой? Я не совсем понимаю условия процедуры is_uploaded_files. Поясните пожалуйста.
   
echo "filename '"$_FILES['userfile']['tmp_name'] . "'.";
}
move_uploaded_file($_FILES['userfile']['tmp_name'], "$final_path"); // после исполнения php-файла, загруженных файлов в указаном каталоге (допустим, папка "content") не обнаружена, т.е. процедура move не работает или я чего-то не понимаю...

$file $_FILES['$userfile']['$tmp_name'];
$getTime date("H:i:s");
$filestat = @stat($file);
$meta id3_get_tag($file); // ID3 не установлен по умолчанию в PHP. Кажется, он устанавливается из дистрибутива PEAR? Как установить PEAR на PHP5 ? (используемый php5 встроен в Denver и используется так)
$query "INSERT INTO MediaLib(id, folder, title, albumn, performer, date, filesize, link, metadata) VALUES (NULL, " $file_dir ", " $meta['title'] . "," $meta['album'] . "," $meta['artist'] . ", " $getTime ", " $filestat['size'] . ", " $final_path ", " $meta ")";
mysql_query ($query); // должна создаться новая строка в БД (2 строки подключения к MySQL-серверу и к БД в начале скрипта я пропустил, я про них помню), где id, folder, и т.д. названия заголовков столбцов в таблице, а $file_dir - это, например, значение в столбике folder таблицы.. я правильно понимая? тут нет никаких подводных камней?

?>

В итоге, как сделать, чтобы MOVE перемещала файл в папку, адрес которой задаётся из переменной $final_path, а не выводила на экран (сейчас файл загружается в текстовом виде в окно браузера).
Как установить поддержку ID3_Tags и PEAR вообще?
Под *math*понимается некоторая функция, которая смотрит сколько было файлов в последнем каталоге, и если он заполнен, меняет адрес каталога на новый. Как написать такую функцию?

Отправлено: 20:19, 05-07-2009

 

Аватара для Coutty

Кот Ти


Сообщения: 7318
Благодарности: 1204

Профиль | Отправить PM | Цитировать


Может быть неверно задаётся адрес директории?
Выведите переменную: echo $final_path перед выполнением этого ветвления.
Вообще, здесь надо использовать относительный путь, а не абсолютный. Например: opendir("./images/dir0001")

Цитата ManHack:
Вообще выражение "Пока ЛОЖЬ не РАВНО <ПЕРЕМЕННАЯ> присвоить функция (параметр) делать... " меня как-то пугает... уж больно неструктурно это выглядит (хотя на php.su приведён именно такой пример). »
Это пример из официальной документации php. От перемены мест сравниваемых, результат не меняется. Но исключается возможность присваивания вместо сравнения (иногда по ошибке можно написать if ($a = false) { ... }. А вот обратное присваивание точно выдаст ошибку: if (false = $a) { ... } ).

Отправлено: 08:10, 08-07-2009 | #11



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


Добавление в базу сделано.

Теперь надо написать поиск.
Поиск должен искать слова из 1 строки сразу в 3 столбцах таблицы и выдавать результаты по их релевантности.
Сколько не бился - толком ничего не вышло.
Подскажите, а?

И/или хотя бы обясните пословно, что здесь написано:
Код: Выделить весь код
"SELECT id FROM CoreLibrary WHERE title LIKE '%". str_replace(" ", "%' OR title LIKE '%", $good). "%'"
($good - данные из строки поиска)
Знак % что даёт? и кавычки как-то странно стоят, аж жуть....

А вот здесь ещё непонятнее:
Код: Выделить весь код
"SELECT *, MATCH row1 AGAINST ('$search')+MATCH row2 AGAINST ('$search')+MATCH row3 AGAINST //('$search') as relev FROM CoreLibrary ORDER BY relev DESC"
здесь $search = $good в пред. случае.
AGAINST? MATCH? DESC?

Отправлено: 21:11, 09-08-2009 | #12


Аватара для Coutty

Кот Ти


Сообщения: 7318
Благодарности: 1204

Профиль | Отправить PM | Цитировать


Цитата:
"SELECT id FROM CoreLibrary WHERE title LIKE '%". str_replace(" ", "%' OR title LIKE '%", $good). "%'"
Выбрать столбец id из таблицы CoreLibrary, где запись в столбце title совпадает с маской поиска (LIKE). Маска поиска состоит из строки запроса ($good), где функцией php str_replace() заменяются пробелы на знаки процента, которые дополнительно добавляются в начале и в конце строки. Знак процента в SQL означает "любые символы". Как * в Windows. Также к результатам добавляются строки (OR), где идёт поиск только по заданной строке, хотя я не вижу в этом смысла - всё равно ведь % их найдёт.
Но согласен, скобки стоят странно. Было бы правильнее расставить их так:
Цитата:
"SELECT id FROM CoreLibrary WHERE title LIKE '%". str_replace(" ", "%", $good) . "%' OR title LIKE '". $good . "'"
Второй запрос:
Цитата:
"SELECT *, MATCH row1 AGAINST ('$search')+MATCH row2 AGAINST ('$search')+MATCH row3 AGAINST //('$search') as relev FROM CoreLibrary ORDER BY relev DESC"
Да, здесь посложнее.
SELECT *, ... - выбрать все строки, удовлетворяющие условию, и справа добавить столбец relev - релевантность поиска (по нему потом идёт сортировка).
MATCH колонка AGAINST ('строка поиска') - полнотекстовый поиск по столбцу. Таблицы должны иметь индекс для полнотекстового поиска. Видимо, здесь идут три подзапроса по разным столбцам, потом им задаётся общее имя (AS relev) и по этой колонке (ORDER BY relev) уже сортируется по убыванию (DESC).
Хотя странно выглядит)

Подробнее о полнотекстовом поиске можете почитать здесь, если интересно. Я не совсем разобрался =~_~=
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:14, 10-08-2009 | #13


Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


Последний запрос (с релевантностью) возвращает таблицу целиком с дополнительным столбиком "relev", в котором одни нули... Почему? $search совпадает со значениями row1 в двух строках.

И где можно получить информацию по "ERROR: "Неизвестная строка с пунктуацией @ 96"" (cобственно, интересуют описания этих самых @96, @100 и т.д.)

Отправлено: 20:59, 10-08-2009 | #14


Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


Вопрос про нолики отпал... И правда, релевантность начинает подсчитываться, когда в базе 10 и более записей...

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

Отправлено: 21:58, 10-08-2009 | #15


Аватара для Coutty

Кот Ти


Сообщения: 7318
Благодарности: 1204

Профиль | Отправить PM | Цитировать


При точных запросах вам не нужна релевантность. Вам нужно точное совпадение:
Код: Выделить весь код
SELECT * FROM table_name WHERE stolb1 = 'запрос' OR  stolb2 = 'запрос' OR stolb3 = 'запрос'
Но обычно полную строку никто не ищет, поэтому вместо stolb = 'запрос' пишите stolb LIKE '%запрос%'. Т.е. пробелы внутри запроса будут обрабатываться как есть, но сама подстрока будет обнаруживаться как в начале, так в середине и конце строк.
Чтобы упорядочить выдачу, добавьте в конце ORDER BY stolb_name ASC
ASC - по возрастанию (указывать не обязательно, т.к. по умолчанию), DESC - по убыванию. Можно указать несколько полей через запятую, тогда упорядочивание будет производиться сначала по первому, потом по второму и т.д.(имеется в виду, что в первом поле "автор" Пушкин будет идти после Гоголя, конечно, но у самого Пушкина произведения будут упорядочены по второму полю "название").

Прим: LIKE - странная штука. Когда я делал поиск по прайсу, она находила даже запросы длиной меньше 4 символов, но что это были за результаты... Каждый раз что-то своё. И только больше 4 символов запроса находились точно.
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:05, 11-08-2009 | #16


Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


С этим разобрались. Я решил пока что отказаться от LIKE и всё выполнил через MATCH AGAINST.
В SQL мой запрос работает отлично, а вот в написанном PHP'шнике - шиш.

Суть php-файла:
PHP код: Выделить весь код

// забираем данные из формы в переменную $search и обрабатываем её

$good trim(preg_replace("/\s(\S{1,1})\s/"" "ereg_replace(" +""  "," $search ")));
// вывод $good на экран показал, что выводится она правильно (в соответствии с запросом в $search)

// ...

$sql "SELECT *, MATCH title AGAINST ('$good')+MATCH avtor AGAINST ('$good')+MATCH genre AGAINST ('$good') AS Relev FROM $table WHERE MATCH (avtor) AGAINST ('$good') ORDER BY Relev DESC"// в SQL это работало!!
$result mysql_query($sql) or die ("err_code = " mysql_error()); //ошибки не выдаёт
echo $result// возвращает[b] Resource id 3[/b], пробовал [b]count($result)[/b] как для массива, вернуло значение 1 (1 элемент в переменной $result) 

В чём теперь дело?
Может я обращение к результатам запроса неправильно делаю? или что ещё?

Отправлено: 19:49, 11-08-2009 | #17


Аватара для Coutty

Кот Ти


Сообщения: 7318
Благодарности: 1204

Профиль | Отправить PM | Цитировать


Вы бы почитали руководство PHP касательно работы с MySQL. Там даже примеры есть.
mysql_query() и должно возвращать идентификатор ресурса. Теперь его надо обработать:
PHP код: Выделить весь код

echo "<table>";

while (
$line mysql_fetch_assoc($result)) // возвращает одну строку из ресурса в виде ассоциативного массива
   
{
   echo 
"<tr><td>$line['stolb1']</td><td>$line['stolb2']</td><td>$line['stolb3']</td></tr>";
   } 

Это сообщение посчитали полезным следующие участники:

Отправлено: 03:57, 12-08-2009 | #18


Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


Тьфу ты, точно... Вылетело из головы >_<
Спасибо!

Отправлено: 09:49, 13-08-2009 | #19


Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


Цитата Coutty:
echo "<table>";
while ($line = mysql_fetch_assoc($result)) // возвращает одну строку из ресурса в виде ассоциативного массива
{
echo "<tr><td>$line['stolb1']</td><td>$line['stolb2']</td><td>$line['stolb3']</td></tr>";
} »
Вот только так не прокатит на самом деле. Ассоциированные массивы не имеют индексов.
Поэтому придётся использовать конструкцию типа foreach ($array as $value) { *** последовательная обработка элементов строки*** }

Отправлено: 12:11, 13-08-2009 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - PHP - несколько вопросов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Несколько вопросов по PHP ManHack Программирование и базы данных 53 24-03-2009 01:23
Несколько вопросов по ОС Master WEB Общий по Linux 33 02-08-2007 23:23
Несколько вопросов raingts Хочу все знать 2 30-01-2007 18:05
Несколько вопросов barbos Общий по Linux 8 16-12-2004 20:40
Несколько вопросов по RH 9 Frost Wolf Общий по Linux 12 07-09-2003 12:51




 
Переход