Консультация № 173846
30.10.2009, 19:46
0.00 руб.
0 13 1
Здраствуйте!
Я начал переделывать кусок кода под себя, но не всё у меня получается. Прошу помощи!
Вот исходный код:
Код:

// Проверяем в запросе есть ли переменная q
if (isset($_POST['q'])) {
// не забываем о безопасности
$q = $db->real_escape_string($_POST['q']);
// больше ли нуля?
if (strlen($q) > 0) {
// Для примера используется запрос вида LIKE '$q%'
if ($query = $db->query( "SELECT name FROM cities WHERE name LIKE '$q%' LIMIT 10")) {
while ($result = $query->fetch_object()) {
// для форматирования результата используется список <li>
// по onClick fill вставляет в поле результат и скрывает окошко выбора
echo ("<li onclick="fill('$result->name');">$result->name</li>");
}
$query->close();
} else {
echo 'ERROR: ' . $db->error;
}
}
}
$db->close();


Вот мой код переделанный но не до конца

Код:

<?php
include_once("include/connectdb.php");

if (isset($_POST['q'])) {
// не забываем о безопасности
$q = mysql_real_escape_string($_POST['q']);
// больше ли нуля?
if (strlen($q) > 0) {
// Для примера используется запрос вида
if ($query = mysql_query( "SELECT `players` FROM `$USER_TABLE_PLAYERS`")) {
while ($result = $query->fetch_object()) {
// для форматирования результата используется список <li>
// по onClick fill вставляет в поле результат и скрывает окошко выбора
echo ("<li onclick="fill('$result->players');">$result->players</li>");
}
$query->close();
}
else {
echo 'ERROR: ' . $dbcnx->error;
}
}
}
?>


Мне нужно чтобы в echo формировался список из таблицы БД.
видимо где while у меня ошибка и ничего не выполняется, выскакивает второе echo ERROR: но без . $dbcnx->error;

Подскажите плиз, как тут сделать правильно!!!

Обсуждение

Неизвестный
30.10.2009, 20:02
общий
это ответ
Здравствуйте, TOK11.
Действительно, ошибка в цикле. Было бы правильно с Вашей стороны привести ее текст, но я могу сказать примерный ее смысл и так: ошибка в том, что Вы с помощью функции mysql_query получаете значение типа resource, а работать с ним пытаетесь, как с объектом. Ни один интерпретатор(и PHP здесь не исключение) не потерпит такого издевательства. Тут надо использовать функцию mysql_fetch_object, которой передавать переменную $query. Функция вернет строку таблицы в виде объекта и передвинет указатель на следующую строку для извлечения. То есть, должно быть
while ($result = mysql_fetch_object($query)) {
...
}
Это раз. Второе: а что это Вы, дорогой товарищ, имя таблицы базы данных сохраняете в переменной? Я про $USER_TABLE_PLAYERS. Дозвольте заметить, что не очень сие гуд. Хотя дело Ваше, особенно, если у Вас register_globals не равно 1(то есть, не включено).

С уважением, Товарищ Бородин
5
Впринципе помогли, спасибо!
Неизвестный
30.10.2009, 20:51
общий
TOK11:
Скорей всего вы пример взяли из какой-нибудь CMS или Framework. В этом примере переменная $db должна являться экземпляром какого-нибудь класса, вспомогательного для работы с БД. Поэтому методы (real_escape_string, query и fetch_object) являются родными для этого класса. Уважаемый Товарищ Бородин указал Вам, что сделать, чтобы переделать на работу с MySQL. Или же укажите ту CMS с которой вы взяли пример...
P.S. Кстати на $query->close(); вроде как тоже должна ошибка выскакивать
Неизвестный
30.10.2009, 21:05
общий
Товарищ Бородин:
Я так и думал, а что мне делать с этим echo ("<li onclick="fill('$result->players');">$result->players</li>"); Здесь тоже что то не так, после внесения правки, всё тотже ERROR.

А имя таблицы у меня создаётся пользователем и должно быть уникально.
Неизвестный
30.10.2009, 21:14
общий
TOK11:
То есть, у Вас еще и таблицы пользователями создаются?! Ну Вы даете!..)))) Как быть с Вашим списком, я, честно говоря, даже и не знаю... Непонятно, в каком виде хранятся имена Ваших пользователей. Мало исходных данных для размышления. Получается вроде как четыре колеса вместе скрутили и стали мечтать, как оно сейчас поедет. А оно не поедет просто потому, что Вы так захотели. Тут надо еще кое-что. А что нужно - можно будет понять, когда Вы подробнее объясните, чего Вы хотите.
Неизвестный
30.10.2009, 21:18
общий
Selax:
Взято с http://www.it-web.ru/2009/03/12/auto-complete-input-form-1/

Я вижу что там какая то работа с обьектами, вот мне и нужно переделать php код под себя.
Неизвестный
30.10.2009, 21:32
общий
TOK11:
А у Вас в PHP MySQLi подключен? Желательно посмотреть на connectdb.php для более подробного анализа
Неизвестный
30.10.2009, 21:42
общий
Товарищ Бородин:
Я делаю автозаполнение полей input по вот этому примеру http://www.it-web.ru/2009/03/12/auto-complete-input-form-1/

яву накатал а вот php там сделан походу на классах, вот мне и надо переделать под себя.
Моя таблица $USER_TABLE_PLAYERS:
players id_players
1. игрок1 id игрока
2. игрок2 id игрока
и т.д.

я выбираю все записи из столбца players
if ($query = mysql_query( "SELECT `players` FROM `$USER_TABLE_PLAYERS`"))

и в цикле формирую список этих записей

while ($result = mysql_fetch_object()) {
// для форматирования результата используется список <li>
// по onClick fill вставляет в поле результат и скрывает окошко выбора
echo ("<li onclick="fill('$result->players');">$result->players</li>");
}
но этот код не формирует список!
Неизвестный
30.10.2009, 21:46
общий
Selax:
У меня стоит Денвер, и чем отличается обычный MySQL от MySQLi я не в курсе:(
connectdb.php у меня самый обычный

Код:
<?php
// Открыть соединение с базой данных
$dblocation = "localhost"; //Имя сервера
$dbuser = "root"; //Имя пользователя
$dbpasswd = ""; //Пароль
$dbname = "dailyvs8"; // Имя базы данных

//Осуществляем соединение с сервером базы данных
//Подавляем вывод ошибок символом @ перед вызовом функции
$dbcnx = mysql_connect($dblocation, $dbuser, $dbpasswd);
if (!$dbcnx) //Если дескриптор равен 0, соединение не установлено
{
//Выводим предупреждение
echo("<P>B настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</Р>");
exit ();
}
mysql_select_db($dbname, $dbcnx);
if (!mysql_select_db($dbname, $dbcnx))
{
//Выводим предупреждение
echo("<P> B настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно. </Р>");
exit(); }
?>
Неизвестный
30.10.2009, 21:51
общий
TOK11:
Конечно, такой код ничего не отобразит, если функции mysql_fetch_object() не передавать результат выполнения функции mysql_query! Тут, конечно, отчасти моя вина, потому что изначально я именно так и написал - mysql_fetch_object вместо mysql_fetch_object($query), но словами-то я написал правильно! Просмотрите мой ответ еще раз, я там исправил ошибку свою.
Неизвестный
30.10.2009, 21:56
общий
TOK11:
Функции с префиксом mysql_ и объекты класса mysqli(это именно класс!) делают примерно одну и ту же работу - работают с базой данных MySQL. Просто делают они это по-разному.
Неизвестный
30.10.2009, 22:03
общий
TOK11:
Отличие MySQL от MySQLi в различном API для работы с БД MySQL. Но раз вы делаете на API MySQL, то Товарищ Бородин уже Вам все расписал. Его вариант в ответе должен быть рабочим. Разве что нужно заменить $query->close() на mysql_close($dbcnx)
Неизвестный
30.10.2009, 23:10
общий
Товарищ Бородин:
Вообщем получил такой код

Код:

<?php
include_once("include/connectdb.php");

if (isset($_POST['q'])) {
// не забываем о безопасности
$q = mysql_real_escape_string($_POST['q']);
// больше ли нуля?
if (strlen($q) > 0) {
// Для примера используется запрос вида
if ($query = mysql_query( "SELECT `players` FROM `$USER_TABLE_PLAYERS`")) {
while ($result = mysql_fetch_object($query)) {
// для форматирования результата используется список <li>
// по onClick fill вставляет в поле результат и скрывает окошко выбора
echo ("<li onclick="fill('$result->players');">$result->players</li>");
}
mysql_free_result($query);
}
else {
echo 'ERROR: ' . mysql_error();
}
}
}
?>


Выдаёт ошибку что имя таблицы не корректное. Оно и в редакторе переменная $USER_TABLE_PLAYERS не подсвечивается. Надо видимо по другому написать запрос... Посоветуйте как его изменить.
Неизвестный
30.10.2009, 23:19
общий
TOK11:
Попробуйте использовать функцию sprintf. Смастырить с ее помощью запрос можно следующим образом:

sprintf("SELECT `players` FROM `%s`", $USER_TABLE_PLAYERS)
Оно выдаст
"SELECT `players` FROM `$USER_TABLE_PLAYERS`", где вместо переменной будет стоять ее значение.

Теперь эту конструкцию надо подставить в функцию mysql_query, и запрос выполнится при условии существования таблицы. Но еще раз Вам повторяю: НИ ОДИН ЧЕЛОВЕК, ЕСЛИ ТОЛЬКО ОН НЕ ВЫЖИЛ ИЗ УМА, НЕ СОЗДАЕТ ОТДЕЛЬНЫХ ТАБЛИЦ ДЛЯ КАЖДОГО ПОЛЬЗОВАТЕЛЯ! Вам это, как новичку, простительно, тем более, что сам грешен - в молодости тоже думал, что это нормально, пока базу данных не "положил"... Вы представьте, что у Вас будет миллион пользователей
Форма ответа