Простенький новигатор по таблице

kazar

Новичок
Простенький новигатор по таблице

Нужно реализовать сабж, если можно простенький пример.
 

Фанат

oncle terrible
Команда форума
кстати, у меня же есть, как раз, простенький пример
без удаления, правда, ну да это можно дописать самому.
тем более, что удалять лучше просто ставя пометку об удалении, а не удаляя физически.
PHP:
<? 
mysql_connect();
mysql_select_db("new");
$table="test";
if($_SERVER['REQUEST_METHOD']=='POST') { 
  if ($id=intval($_POST['id'])) {
    $query="UPDATE $table SET name='".mysql_real_escape_string($_POST['name'])."' WHERE id=$id";
  } else {
    $query="INSERT INTO $table SET name='".mysql_real_escape_string($_POST['name'])."'";
  }
  mysql_query($query);
  header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']); 
  exit; 
} 
if (!isset($_GET['id'])) { 
  $LIST=array();
  $query="SELECT * FROM $table"; 
  $res=mysql_query($query);
  while($row=mysql_fetch_assoc($res)) $LIST[]=$row;
  include 'list.php';
} else { 
  if ($id=intval($_GET['id'])) {
    $query="SELECT * FROM $table WHERE id=$id"; 
    $res=mysql_query($query);
    $row=mysql_fetch_assoc($res);
    foreach ($row as $k => $v) $row[$k]=htmlspecialchars($v);
  } else {
    $row['name']='';
    $row['id']=0;
  }
  include 'form.php';
} 
?>

form.php
<form method="POST">
<input type="text" name="name" value="<?=$row['name']?>"><br>
<input type="hidden" name="id" value="<?=$row['id']?>">
<input type="submit"><br>
<a href="?">Return to the list</a>
</form>

list.php
<a href="?id=0">Add item</a>
<? foreach ($LIST as $row): ?>
<li><a href="?id=<?=$row['id']?>"><?=$row['name']?></a>
<? endforeach ?>
 

akd

dive now, work later
Команда форума
Фанат, ты решил проверить пойдет-ли он читать или возьмет твой код? :)
 

Фанат

oncle terrible
Команда форума
я не думаю, что этот код имеет хоть какую-то практическую ценность без того, чтобы разобраться, как в нём что работает.

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

akd

dive now, work later
Команда форума
Фанат, согласен, чтобы применить придется понять а если поймет, то уже плохо писать не станет.
 

alpine

Новичок
Фанат
В коде нет обработки ошибок возникающих при работе с БД.
 

Фанат

oncle terrible
Команда форума
и хорошо, что нету.
поскольку этот пример иллюстрирует именно тот самый "новигатор", а не реальное приложение.
здесь показан принцип.
если добавлять всяческие проверки, то принцип окажется под ними просто погребён и станет не виден.

чтобы написать идеальную же обработку ошибок, придётся писать специальную для этого функцию.

обработка ошибок - совсем отдельная тема ,и не менее сложная, чем работа с базой данных.

Хотя, конечно, какой-то её элемент сюда внести не мешало бы...

-~{}~ 31.08.06 13:40:

Давайте придумаем, как сделать вывод сообщений об шибке?

во-первых, делаем ещё один шаблон - error.php
во-вторых, после каждой mysql_query надо сделать trigger_error(mysql_error()) и вывести этот самый error.php
при обработке поста это просто - локейшен.
а вот при выводе таблицы уже сложнее - зависит от способа шаблонизации.
и, в любом случае, придётся делать длинный иф. засада.
 

akd

dive now, work later
Команда форума
Фанат, а в любом случае если тестировать mysql_errno() и выводить ошибки в отдельном шаблоне получится лестница.
от этого просто никуда.

как примера хватит обработать только connect() & select_db() а остальное человек должен додумать сам.
 

alpine

Новичок
Фанат
С trigger_error+error.php возникает необходимость использовать set_error_handler для которого необходимо писать функцию чтобы вывести шаблон error.php. Imho такой вариант хорош для обработки ошибок целого проекта.
Для учебного скрипта достаточно конструкции or die() для mysql_connect и mysql_select_db и массива $errors в которой загонять сообщения об ошибках, которые могут возникнуть в mysql_query(). Далее в шаблоне если массив не пустой вывести все ошибки.
 

Фанат

oncle terrible
Команда форума
ничего тут не возникает. никакой set_error_handler нафиг не нужен.
а вот за die() надо руки отрывать.

сказано же, что это учебный код. чтобы люди учились делать по-человечески.
ключевое слово - "по-человечески". or die() с этим словом не имеет ничего общего.

в общем, вот так будет, я думаю, самое оптимальное:
PHP:
$query="SELECT * FROM $table";  
$res=mysql_query($query) or trigger_error(mysql_error()); 
if ($res) {
  while($row=mysql_fetch_assoc($res)) $LIST[]=$row; 
  include 'list.php'; 
} else {
  include 'error.php'; 
}
ЗЫ. если уж что-то городить, то try catch
 

alpine

Новичок
Фанат
1) Про die() я с вами не согласен так как если не удалось подключится к серверу/базе данных дальнейшее выполнение конкретного скрипта не имеет никакого значения.
2) В вашем случае trigger_error() выводит в браузер ошибку E_USER_NOTICE при error_reporting(E_ALL) + еще выводится error.php. Зачем? Лично я считаю, что trigger_error() идет рука об руку с set_error_handler().
 

Фанат

oncle terrible
Команда форума
Про die() я с вами не согласен так как если не удалось подключится к серверу/базе данных дальнейшее выполнение конкретного скрипта не имеет никакого значения.
не понял,а кто его здесь продолжает выполнять?
В вашем случае trigger_error() выводит в браузер
я бы попросил без инсинуаций
в НАШЕМ случае в браузер будет выведено сообщение "Извините, произошла внутренняя ошибка сервера. попробуйте зайти позже"
 

alpine

Новичок
Фанат
>> не понял,а кто его здесь продолжает выполнять?
Хорошо, тогда в каком месте происходит прерывание выполнения скрипта после ошибки подключения к БД? В шаблоне error.php?
>> будет выведено сообщение "Извините, произошла внутренняя ошибка сервера. попробуйте зайти позже"
Предлагаю уточнить в этом месте. Есть два вида сообщений об ошибках для пользователя и для девелопера. Я про для девелопера а вы?
 
Сверху