IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   MySQL проблема с выводом таблицы (http://www.imho.ws/showthread.php?t=80645)

M@ngust 27.02.2005 16:55

MySQL проблема с выводом таблицы
 
решил сделать маленький каталог дисков для себя
есть простая таблица
CREATE TABLE cd_disk (
nid int(10) NOT NULL auto_increment,
date varchar(10) NOT NULL default '',
time varchar(5) NOT NULL default '',
cdname varchar(100) NOT NULL default '',
text text NOT NULL,
tipcd varchar(50) NOT NULL default '',
PRIMARY KEY (nid)
) TYPE=MyISAM;

задача с выборкой
показать последнии записи, например 10
пытался решить но встал на месте
сортирую в обратном порядке:
$result = sql_query("select nid, date, time, newsname, text, tip from cd_disk order by nid DESC", $dbi);
а как сделать сам вывод...?
в обычном порядке: наименование(cdname) описание(text) тип диска(tipcd)

Aeon 27.02.2005 19:47

на каком языке пишешь-то?

M@ngust 28.02.2005 06:33

на PHP

Ghost 28.02.2005 06:57

M@ngust
http://ru.php.net/manual/en/function.mysql-query.php

M@ngust 28.02.2005 12:12

предложили вот такое решение

$result = mysql_query("SELECT nid, date, time, newsname, text, tip FROM cd_disk ORDER BY nid DESC", $dbi);
echo "<pre>";
while ($row = mysql_fetch_assoc($result)) {
print_r($row);
echo "<br>";
}
echo "</pre>";

данный код
выдает ошибку
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource

соединение с базой происходит, запрос тоже срабатывает
ошибка указывает на строку условия цикла
в чем загвоздка?
в чем проблема?

может быть проблема что я на локальной машине отлаживаю? :(

Ghost 28.02.2005 12:14

M@ngust
А что происходит при вставке
PHP код:

if (!$result) {
   
$message  'Invalid query: ' mysql_error() . "\n";
   
$message .= 'Whole query: ' $query;
   die(
$message);


?

M@ngust 28.02.2005 12:22

может быть проблема что я на локальной машине отлаживаю? :(

Ghost 28.02.2005 12:43

Кстати, ты уверен, что коннект и запрос срабатывают успешно? Не забывай, что исключительные ситуации здесь нужно обрабатывать ручками...
PHP код:

<?php
$myDBI 
mysql_connect('localhost''mysql_user''mysql_password');
if (!
$myDBI) { die('Could not connect: ' mysql_error()); }
echo 
'Connected successfully';
$db_selected mysql_select_db('db_name'$myDBI);
if (!
$db_selected) { die ('Can\'t use dbname: ' mysql_error()); }
$query "...";
$result mysql_query($query$myDBI);
if (!
$result) { 
   
$message  'Invalid query: ' mysql_error() . "\n"
   
$message .= 'Whole query: ' $query
   die(
$message); 
}
echo 
"<pre>";
while (
$row mysql_fetch_assoc($result)) {
   
print_r($row);
   echo 
"<br>";
}
echo 
"</pre>";
mysql_free_result($result);
mysql_close($myDBI);
?>


Sheryld 28.02.2005 14:14

проверка !$result не корректна, т.к. даже если возвращено 0 записей, то $result все равно будет не пустой, следовательно, вернется true и будет продолжаться выполнение скрипта и тогда вот тут:

mysql_fetch_assoc($result)

будет ошибка.

корректнее будет так:

if (mysql_num_rows($result) > 0)

а в случае insert, update, delete

mysql_affected_rows($result) {оператор_сравнения} 0)

оператор будет разным в зависимости от запроса(учитывая и условие выборки), логики приложения(собвстенно что считать "неудачей").

подробнее в мане.

p.s. я не слишком нудный? :biggrin:

Hubbitus 28.02.2005 16:06

Цитата:

Sheryld:
проверка !$result не корректна, т.к. даже если возвращено 0 записей, то $result все равно будет не пустой,
И все остальное это понятно, только Ghost в 6 посте говорил не про количество результатов в выборке, а проверить нормально ли вообще выполнился запрос (посмотри что выводится в описании), так что все верно и проверка вполне корректна.
Цитата:

Sheryld:
корректнее будет так:

if (mysql_num_rows($result) > 0)
Да вполне корректно и так:
while ($row = mysql_fetch_assoc($result)) {
print_r($row);
echo "<br>";
}
после проверки из 6 поста, поскольку если ни одной записи в результате нету, и запрос выполнен нормально то все абсолютно верно и цикл while просто не выполнится ниразу. Зачем городить лишнее-то!

M@ngust 28.02.2005 16:12

вопрос решен.
проблема была в запросе
$result = sql_query("select nid, date, time, newsname, text, tip from cd_disk order by nid
ошибочка была именно в несовпадении запроса
правильно будет так:
$result = sql_query("select nid, date, time, cdname, text, tipcd from cd_disk order by nid DESC limit 10", $dbi);
имена полей.

очень помог кусок:

if (!$result) {
$message = 'Invalid query: ' . mysql_error() . "\n";
$message .= 'Whole query: ' . $query;
die($message);
}

DeADMoroZ 28.02.2005 16:24

Кстати, заместо
$result = sql_query("select nid, date, time, cdname, text, tipcd from cd_disk order by nid DESC limit 10", $dbi);
можно написать просто
$result = sql_query("select * from cd_disk order by nid DESC limit 10", $dbi);
* - это типа, выбрать все поля

Ghost 28.02.2005 16:28

Sheryld
Все проверки корректны. Более того, код намерено взят из мануала с офсайта с минимальными дополнениями и изменениями; код проверен - специально в него вставлялись ошибочные значения для конекта, выбора базы и выполнения запроса - скрипт правильным образом "умирал" и выдавал соответсвующие сообщения; без вставленных намерено ошибок скрипт выводил верный результат.

Sheryld 28.02.2005 16:41

updated:

ошибся:) звиняйте хлопцы:)

Sych 01.03.2005 15:53

Я тут еще вставлю свои 5 копеек насчет кода.

Код конечно рабочий но далек от совершенства и мана - про конструкцию or die() слышали ???

Hubbitus 01.03.2005 16:05

Цитата:

Sych:
Код конечно рабочий но далек от совершенства и мана - про конструкцию or die() слышали ???
Это уже конечно флейм пошел, но тоже тогда отвечу (1 раз), чем интересно конструкция
$myDBI = mysql_connect('localhost', 'mysql_user', 'mysql_password'); or die('Could not connect: ' . mysql_error());
так уж "совершеннее" чем
Цитата:

Ghost:
$myDBI = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$myDBI) { die('Could not connect: ' . mysql_error()); }
??? Только тем что в одну строчку?

Sheryld 01.03.2005 17:30

а я все же влезу еще разок. почему сразу die? бывает часто, что запрос не возвращает записи по причине того, что просто нету подходящих записей, а бд в порядке.

тогда, обычно выводят альтернативный элемент(скажем заглушку). в нашем же случае вы в любом случае получите <pre>{message}</pre>
а если при 0 записей не надо выводить <pre> а нужно выводить скажем <div>not found</div>

посему, мне кажется, что лучше все же делать die на конкретных, критических ошибках, а в остальных случаях проверять количество возвращаемых записей и на основе этого уже делать вывод.

это все просто размышления...

Sych 01.03.2005 17:47

в случае с дае мы имеем пошаговую отладку + не тратим силы на лишние ифф, хотя все это из разряда обсуждений высоких материй в контексте пространственно ременного континума и корпускулярно-волнового дуализма, насчет того что 0 записей в результате запроса так это совсем и не ошибка а возвращенный нормальный результат который порядочный программист должен обрабатывать на автомате.

Hubbitus 01.03.2005 19:21

Цитата:

Sheryld:
а я все же влезу еще разок. почему сразу die? бывает часто, что запрос не возвращает записи по причине того, что просто нету подходящих записей, а бд в порядке.......
При коннекте никаких записей получено быть не должно и в 99% случев это критическая ошибка!
Да и к тому же 0 записей в результате совсем не ошибка, а нормальный пустой результат выборки!

Цитата:

Sych:
в случае с дае мы имеем пошаговую отладку + не тратим силы на лишние ифф,
Конструкция "что-то or die()" это посути тотже иф, и ничего не тратится больше ни в том ни в другом случае!


Часовой пояс GMT +4, время: 10:48.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.