Консультация № 176087
17.01.2010, 00:31
0.00 руб.
0 9 1
Здравствуйте, эксперты.

У меня к вам два вопроса.
1. Возможно ли сделать так, чтобы при запросе одной страницы происходило перенаправление на другую и в перенаправлении указывалось с какой страницы произошел переход.
Например, есть страница about.php, содержащая скрипт обработки БД, но на сайте ссылки выполнены в виде fam_imya.php, но таких страниц не существует на сервере, а при их вызове происходит перенаправление на about.php и зависимости от имени страницы с которой произошло перенаправление выводиться нужная информация о человеке.
2. В файле about.php делаю запрос к БД с информацией о людях. Структура БД и код запроса приведена в приложении.
При выполнении строчки
$query = "SELECT * FROM bd_name WHERE team LIKE 'basket' ORDER BY reserved_4 ASC LIMIT 0,30";
выводится только первые 10 строк из таблицы без сортировки по reserved_4. По всем остальным полям сортировка проходит без помех, но как бы я не сортировал все равно выводится всего 10 строк вместо 30. Даже если я напишу:
$query = "SELECT * FROM bd_name WHERE 1" и $query = "SELECT * FROM bd_name выводится только первые 10 строк.

В поле reserved_4 информация представлена в виде строк "01#12#", "02#11#", "03#14#", "04#10#" и т.д. цифра1#цифра2#. При выборке и сортировке в PhpMyAdmin всё сортируется верно и выводится нужная информация, а при копировании запроса в php-файл при выполнении происходит сбой.
Поля
`description_2` text collate utf8_unicode_ci NOT NULL,
`description_3` text collate utf8_unicode_ci NOT NULL,
`reserved_1` text collate utf8_unicode_ci NOT NULL,
`reserved_2` text collate utf8_unicode_ci NOT NULL,
`reserved_3` text collate utf8_unicode_ci NOT NULL,
пока не заполнены и оставлены на будущее.
Поле
`blood_type` text collate utf8_unicode_ci NOT NULL,
заполнено не у всех людей.

Приложение:
1. Запрос:
<?
$host = "localhost";
$user = "root";
$pass = "";
$database = "bd_gamers";
$dz = mysql_connect($host, $user, $pass);
mysql_select_db($database, $dz);

$query = "SET NAMES utf8";
$sql = mysql_query($query);
$query = "SELECT * FROM bd_name WHERE team LIKE 'basket' ORDER BY reserved_4 ASC LIMIT 0,30";
$sql = mysql_query($query) or die ("Query failed: " . mysql_error() . " Actual query: " . $query);;
echo $query;
echo $sql;

while ($ds = mysql_fetch_object($sql))
{
$name_1 = $ds -> name_1;
$name_2 = $ds -> name_2;
$photo = $ds -> photo;
$date_of_birth = $ds -> date_of_birth;
$res_4 = $ds -> reserved_4;
$id = $ds -> id;

echo "<tr>";
echo "<td>$res_4</td>";
echo "<td>$name_1 $name_2</td>";
echo '<td><img src="' . $photo . '"></td>';
echo "<td>$date_of_birth</td>";
echo "</tr>";

echo "$photo
";
}
mysql_close($dz);
// echo "$query
";
// echo "$sql
";
?>

2. Структура БД:
CREATE TABLE `bd_name` (
`name_url` text collate utf8_unicode_ci NOT NULL,
`name_1` text collate utf8_unicode_ci NOT NULL,
`name_2` text collate utf8_unicode_ci NOT NULL,
`photo` text collate utf8_unicode_ci NOT NULL,
`date_of_birth` date NOT NULL,
`place_of_birth` text collate utf8_unicode_ci NOT NULL,
`team` text collate utf8_unicode_ci NOT NULL,
`height` float default NULL,
`blood_type` text collate utf8_unicode_ci NOT NULL,
`begin_date_1` date NOT NULL,
`end_date_1` date NOT NULL,
`description_1` text collate utf8_unicode_ci NOT NULL,
`description_2` text collate utf8_unicode_ci NOT NULL,
`description_3` text collate utf8_unicode_ci NOT NULL,
`reserved_1` text collate utf8_unicode_ci NOT NULL,
`reserved_2` text collate utf8_unicode_ci NOT NULL,
`reserved_3` text collate utf8_unicode_ci NOT NULL,
`reserved_4` text collate utf8_unicode_ci NOT NULL,
FULLTEXT KEY `reserved_4` (`reserved_4`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Обсуждение

Неизвестный
18.01.2010, 13:14
общий
это ответ
Здравствуйте, Puma.
По первому вопросу: логичнее всего использовать .htaccess со строками

RewriteEngine on
RewriteRule ^([a-zA-Zа-яА-Я]+)_([a-zA-Zа-яА-Я]+)\.php? about.php?fam=$1&imya=$2 [L]

(как-то так, проверьте сами регулярное выражение)

это перенаправит запрос по ссылке вида fam_imya.php на скрипт about.php с передачей GET-строки: about.php?fam=lalala&imya=lblblb

по второму вопросу: дело явно в содержимом, а не в запросе к базе; возможно, даже в выводе его в виде html.

чтобы убедиться, что проблема не в запросе, посмотрите html source или выведите временно в начале вывода в браузер echo"<plaintext>"; это запретит браузеру выполнение html и позволит нам увидеть ВЕСЬ вывод.

3
Спасибо за ответ.<br><br>Проверил с помощью echo"<plaintext>". На экране появился обычный html-код. Ниже привожу его кусок с форматированием, так он выводится слитно без пробелов и переводов строк:<br><table><br> <tr> <br><td>ds</td> <br><td>Имя</td> <br><td>Фото</td> <br><td>Дата рождения</td> <br></tr> <br><br>SELECT * FROM perfchars LIMIT 0,100<br><br>Resource id #4<br><br><tr><br><td></td> <!--вот здесь должна выводиться строка из поля reserved_4, но она не выводится, при запросе на выборку только этого поля приходит пустой ответ, именно поэтому я подумал, что проблема именно в php-коде, т.к. при запросе через phpMyAdmin все нормально выводиться --><br><td>Наталья Бесман</td><br><td><img src="/pics/nataliya_besman.jpg"></td><br><td>1990-09-08</td><br></tr><br><tr><br><td></td><br><td>Илья Горюнов</td><br><td><img src="/pics/ilya_goryunov.jpg"></td><br><td>1988-02-10</td><br></tr><br><!-- и т.д. ровно 10 строчек, без каких-либо ошибок, при вставке этого кода в отдельный html-файл, все прекрасно выводиться в браузер --><br></table><br><br>При запросе <br> $query = "SELECT reserved_4 FROM bd_name LIMIT 0,100";<br> $sql = mysql_query($query) or die ("Query failed: " . mysql_error() . " Actual query: " . $query);;<br> while ($ds = mysql_fetch_object($sql))<br> {<br> $res_4 = $ds -> reserved_4;<br> <br> echo "<br>";<br> echo "$res_4";<br> echo "<br>";<br><br> }<br>Выводятся лишь символы <br>: <br><br><br><br><br><br><br><br><br> и т. д.<br>При вставке запроса в phpMyAdmin все равботает. <br>Не могу понять.<br><br>Все запросы писал по инструкции с сайта: http://www.opennet.ru/base/dev/pl_sql_select.txt.html<br><br>Я думаю, может быть попробовать какую-то другую функцию вместо mysql_fetch_object для обработки результатов запроса.
Неизвестный
18.01.2010, 19:08
общий
Ошибся с формой отправки и оправил доп. вопрос в форме оценки. Извините. И конечно ошибся с названием таблицы в форме ответов. Здесь название правильные. Вместо таблицы perfchars используется таблица bd-name. Просто уже долго не могу совладать с кодом и думал пересоздание таблицы поможет.

Проверил с помощью echo"<plaintext>". На экране появился обычный html-код. Ниже привожу его кусок с форматированием, так он выводится слитно без пробелов и переводов строк:
<table>
<tr>
<td>ds</td>
<td>Имя</td>
<td>Фото</td>
<td>Дата рождения</td>
</tr>

SELECT * FROM bd-name LIMIT 0,100

Resource id #4

<tr>
<td></td> <!--вот здесь должна выводиться строка из поля reserved_4, но она не выводится, при запросе на выборку только этого поля приходит пустой ответ, именно поэтому я подумал, что проблема именно в php-коде, т.к. при запросе через phpMyAdmin все нормально выводиться -->
<td>Наталья Бесман</td>
<td><img src="/pics/nataliya_besman.jpg"></td>
<td>1990-09-08</td>
</tr>
<tr>
<td></td>
<td>Илья Горюнов</td>
<td><img src="/pics/ilya_goryunov.jpg"></td>
<td>1988-02-10</td>
</tr>
<!-- и т.д. ровно 10 строчек, без каких-либо ошибок, при вставке этого кода в отдельный html-файл, все прекрасно выводиться в браузер -->
</table>

При запросе
$query = "SELECT reserved_4 FROM bd_name LIMIT 0,100";
$sql = mysql_query($query) or die ("Query failed: " . mysql_error() . " Actual query: " . $query);;
while ($ds = mysql_fetch_object($sql))
{
$res_4 = $ds -> reserved_4;

echo "
";
echo "$res_4";
echo "
";

}
Выводятся лишь символы
:








и т. д.
При вставке запроса в phpMyAdmin все равботает.
Не могу понять.

Все запросы писал по инструкции с сайта: http://www.opennet.ru/base/dev/pl_sql_select.txt.html

Я думаю, может быть попробовать какую-то другую функцию вместо mysql_fetch_object для обработки результатов запроса.
Неизвестный
19.01.2010, 09:18
общий
Puma:
ок, давайте попробуем так: перепишите запрос по правилам, с кавычками: имена бд, таблиц и полей в косых одинарных (`), параметры в прямых одинарных ('), то есть

$query = "SELECT * FROM `bd_name` WHERE `team` LIKE 'basket' ORDER BY `reserved_4` ASC LIMIT 0,30";

возможно, мускул считает reserved без кавычек служебным словом.

кстати, кавычки в запросе - правильная практика, в ряде случаев позволяет предотвратить sql-инъекции ;-)
Неизвестный
19.01.2010, 19:58
общий
Сделал с косыми одинарными для бд, таблиц, полей и прямыми одинарными для параметров. Ничего не изменилось.

Я разделил поле reserved_4 на два reserved_2 и reserved_3, в reserved_2 содержится число что было в поле reserved_4 до знака #, а в reserved_3 число, что в reserved_4 между знаками #.

Полям reserved_2 и reserved_3 сделал тип TinyInt.

И пишу запрос на выборку

$query = "SELECT * FROM `bd_name` WHERE `team` LIKE 'basket' ORDER BY `reserved_2` ASC LIMIT 0,30";
или
$query = "SELECT * FROM `bd_name` WHERE `team` LIKE 'basket' ORDER BY `reserved_3` ASC LIMIT 0,30";

Конечно, никакой сортировки не происходит, а при выборке только полей reserved_2 и reserved_3 приходит пустой ответ.
Такое ощущение, что при запросе к базе не проходит запрос на выборку полей и ответ, конечно, не может быть получен.
По всем остальным полям возможна сортировка, выборка, без проблем.

И не понимаю, почему не работает выборка всей таблицы при запросе
$query = "SELECT * FROM `bd_name` LIMIT 0,30";

а выводится лишь 10 строчек.
Неизвестный
19.01.2010, 22:36
общий
Я совершенно ничего не понимаю, залил на удаленный сервер (Unix) БД и скрипт, вместо 10 строчек выводится столько сколько нужно, т.е. если LIMIT 0,30, то 30 строк и выводится.
Но почему же тогда на локальном Денвере все так плохо.

Сортировку по reserved_4 пока не проверял, проверю. напишу.
Неизвестный
20.01.2010, 10:38
общий
вот ей-богу, переименуйте, что-ли, поля reserved_* - чую, слово ему не нравится ))) Ну всё корректно, это даже удалённый хостинг подтверждает )))
Неизвестный
20.01.2010, 18:13
общий
Да, так и сделал, переименовал поля reserved_* в sluzheb*.
Пишу запрос
$query = "SELECT * FROM `bd_name` WHERE `team` LIKE 'basket' ORDER BY `sluzheb4` ASC LIMIT 0,30";
она мне в ответ
Query failed: Unknown column 'sluzheb4' in 'order clause' Actual query: SELECT * FROM `bd_name` WHERE `team` LIKE 'basket' ORDER BY `sluzheb4` ASC LIMIT 0,30

В таком случае поля не существуют, т.е. с reserved_* существуют, а с sluzheb* нет.

Но самое странное, что на удаленном сервере все работает, даже сортировка. Так как мне нужно.
Это получается, что это или неисправность Денвера или ОС.
Неизвестный
20.01.2010, 22:43
общий
Спасибо большое за помощь. Теперь стало более понятно, что нужно делать. Буду тестировать код на удаленном сервере.

Можно задать еще один вопрос.

Возможно ли выбрать данные из БД и занести их в олбычный массив, например, name[], чтобы можно было обратиться к нему в любом месте кода. Пробовал написать так:

$i = 0;
while ($ds = mysql_fetch_object($sql))
{
$name_url_bd = $ds -> name_url;
$name_1_bd = $ds -> name_1;
$photo_bd = $ds -> photo;

$name_url[$i] = $name_url_bd;
$name_1[$i] = $name_1_bd;
$photo[$i] = $photo_bd;

$i++;
}

Но во всех ячейках массивов $name_url[$i], $name_1[$i], $photo[$i] оказывается значение самой последней строки, выбранной их БД.
Неизвестный
21.01.2010, 17:11
общий
В вашем коде лично я ошибок не вижу, но РНР виднее ))) думаю, это связано с использованием объекта и версией РНР (на сайте РНР есть инфа о том, что в такой конструкции возвращаются разные объекты, начиная с версии 5.0.0, но не понимаю, какая разница), попробуйте вместо mysql_fetch_object() использовать mysql_fetch_array() (или можно mysql_fetch_assoc() для только ассоциативных ключей или mysql_fetch_row для только цифровых ключей)

Ну и, конечно, весь код можно упростить до

while ($ds = mysql_fetch_assoc($sql))
{
$name_url[] = $ds['name_url'];
$name_1[] = $ds['name_1'];
$photo[] = $ds['photo'];

}
// ну и вывод, для красоты:
echo "<pre>";
print_r($name_url[]);
print_r($name_1[]);
Форма ответа