Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Обновление записи в базе
 
 автор: juliya   (27.03.2006 в 13:00)   письмо автору
 
 

Здравствуйте!
Мне нужно обновить запись в базе. Для этого должна открыться форма с ранее заполненными полями, данные для которых берутся из базы. У меня есть ссылка:

<A class=link href="edit.php?id="<?print $id;?> target="_blank">Edit</A>

Но в файл edit.php не передается id нужной записи. Подскажите пожалуйста как правильно сделать.

   
 
 автор: Trianon   (27.03.2006 в 13:16)   письмо автору
 
   для: juliya   (27.03.2006 в 13:00)
 

Когда Вы подводите мышь к ссылке, в строке статуса должен быть виден адрес ...edit.php?id=... . В нем id правильный?
Если правильный - то id в скрипт передается правильно (и вероятно уже в скрипте edit.php не[правильно] принимается ).
Если в строке статуса id неправильный - значит в переменной $id в том фрагменте, который Вы привели, лежит совсем не id нужной записи, а что-то другое.

   
 
 автор: juliya   (27.03.2006 в 13:21)   письмо автору
 
   для: Trianon   (27.03.2006 в 13:16)
 

Там вообще где id= ничего не выводится, а остается вот так. Может записано неправильно?

   
 
 автор: Trianon   (27.03.2006 в 13:32)   письмо автору
 
   для: juliya   (27.03.2006 в 13:21)
 

Значит в $id - пустая строка.

   
 
 автор: juliya   (27.03.2006 в 13:37)   письмо автору
 
   для: Trianon   (27.03.2006 в 13:32)
 

А как туда подставить id выбранной для редактирования записи?
У меня в этом файле в самом начале стоит $id = $_GET["id"]; а потом по этому же id выводится нужная запись из базы. Куда же он девается?

   
 
 автор: cheops   (27.03.2006 в 13:43)   письмо автору
 
   для: juliya   (27.03.2006 в 13:37)
 

Попробуйте спускать оператор
<?php
  
echo "id = ".$id;
?>

начиная от записи $id = $_GET["id"]; вниз - так можно будет локализовать место, где переменная $id обнуляется.

   
 
 автор: juliya   (27.03.2006 в 13:54)   письмо автору
 
   для: cheops   (27.03.2006 в 13:43)
 

id нигде не обнуляется! До конца файла выводится. Но там где нужно все равно пусто.

   
 
 автор: Trianon   (27.03.2006 в 14:24)   письмо автору
 
   для: juliya   (27.03.2006 в 13:37)
 

Очень тяжело искать черную кошку в темной комнате. Показали бы файл чтоли.... аттачем желательно.

   
 
 автор: juliya   (27.03.2006 в 14:42)   письмо автору
 
   для: Trianon   (27.03.2006 в 14:24)
 

Прикрепила

   
 
 автор: Trianon   (27.03.2006 в 15:13)   письмо автору
 
   для: juliya   (27.03.2006 в 14:42)
 

<A class=link href="edit.php?id=<?print $id;?>" target="_blank">Edit</A>

В общем-то, Вы были правы. Ошибка была именно в этой строке. Значение $id подставлялось за пределами кавычек.

   
 
 автор: juliya   (27.03.2006 в 16:22)   письмо автору
 
   для: Trianon   (27.03.2006 в 15:13)
 

Спасибо. Теперь все передается. Только теперь "ругается" на строку:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in D:\SERVER\MyExamples\notebook_old\edit.php on line 339

А написано так:

$id = intval($_GET["id"]);
    $query = "SELECT * FROM vsm_notebook where f_id =" .$id;
      $result = mysql_query($query);

 while ($row = mysql_fetch_array($result))

Самое главное, что в других файлах сделано точно также. А тут что-то не нравится. Прикрепляю файл.

   
 
 автор: Trianon   (27.03.2006 в 17:25)   письмо автору
 
   для: juliya   (27.03.2006 в 16:22)
 

Это происходит потому, что у у Вас не выполняется подключение к БД.
Этот фрагмет

//-----------------------------------------------------------
         // Подключаем файл "connect_db.php" для соединения с базой данных
// include "connect_db.php";

Вы почему-то поместили внутри условного оператора

        if (isset($HTTP_POST_VARS["submit"]) and $HTTP_POST_VARS["submit"])
        {
..............
..............
..............
}

А поскольку данные POST-формы при GET-запросе не передаются, весь код внутри фигурных скобок пропускается. Пропускается и include. В результате нет коннекта с БД, нет нормального результата запроса - есть null, который Вы скармливаете функции mysql_fetch_array() - вот она и ругается.

   
 
 автор: cheops   (27.03.2006 в 17:31)   письмо автору
 
   для: juliya   (27.03.2006 в 16:22)
 

Поставьте проверку
<?php
$id 
intval($_GET["id"]); 
    
$query "SELECT * FROM vsm_notebook where f_id =" .$id
      
$result mysql_query($query); 
      if(!
$result) exit($query." -- ".mysql_error());
while (
$row mysql_fetch_array($result))
?>

Что-нибудь дополнительно выводится?

   
 
 автор: juliya   (28.03.2006 в 08:41)   письмо автору
 
   для: cheops   (27.03.2006 в 17:31)
 

Выводится:
SELECT * FROM vsm_notebook where f_id =172 -- No Database Selected

   
 
 автор: juliya   (28.03.2006 в 10:21)   письмо автору
 
   для: juliya   (28.03.2006 в 08:41)
 

Мне нужно сделать редактирование записи в базе. Для этого должна открыться форма с заполненными полями, данные для которых беруться из базы. Далее изменяются поля, идет проверка на правильность и отправляется в базу. Подскажите, пожалуйста, можно ли сделать вывод в форму и проверку на правильность в одном файле?

   
 
 автор: Trianon   (28.03.2006 в 10:43)   письмо автору
 
   для: juliya   (28.03.2006 в 10:21)
 

Всё это можно сделать в одном файле. И сохранение обратно в базу тоже можно сделать там же.

Теоретически, любой проект можно запихнуть в один файл. Практически, в нем будет трудно потом разбираться.

В Вашем случае строки подключения к БД (266-267 строки аттача 27.03.2006 в 16:22)
         // Подключаем файл "connect_db.php" для соединения с базой данных
 include "connect_db.php";

нужно перенести вверх и поместить их после 32 строки, т.е. между
<?php

и
        if (isset($HTTP_POST_VARS["submit"]) and $HTTP_POST_VARS["submit"])


PS И между нами... чтобы понять, что именно у Вас не работает, неплохо было бы поглядеть на дамп базы. Или хотя бы часть его. А то когда из нескольких дестятков полей есть только пять, проверять код весьма несладко.

   
 
 автор: juliya   (28.03.2006 в 13:24)   письмо автору
 
   для: Trianon   (28.03.2006 в 10:43)
 

Подскажите, пожалуйста, можно ли по нажатию на кнопке "submit" передать id записи в другой файл? Делала

 $id = $_POST["id"];
 print "id = ".$id;

В ответ:

Notice: Undefined index: id in D:\SERVER\notebook\edit_contact.php on line 35
id = 

И в базе ничего не обновляется.

   
 
 автор: cheops   (28.03.2006 в 13:47)   письмо автору
 
   для: juliya   (28.03.2006 в 13:24)
 

А в HTML-форме у вас имеется скрытое поле id?
<input type=hidden name=id value=<?php echo $id?>>

   
 
 автор: juliya   (28.03.2006 в 13:56)   письмо автору
 
   для: cheops   (28.03.2006 в 13:47)
 

Спасибо! Теперь все обновляется!

if(isset($_FILES['photo']) && !empty($_FILES['photo']['tmp_name'])) 

  ini_set("max_execution_time", 999999); 
  $photo = $_FILES['photo']['tmp_name'];  
  // otkrivaem 
  $file = fopen($photo, "rb");  
  // chitaem 
  $buffer = fread($file, filesize($photo)); 
  // zakrivaem 
  fclose($file);

echo '<pre>'; 
print_r($_FILES); 

    if (empty($error))
  {  $query = "UPDATE vsm_notebook SET f_surname='$HTTP_POST_VARS[surname]', f_name='$HTTP_POST_VARS[name]', f_patronymic='$HTTP_POST_VARS[patronymic]', f_country='$HTTP_POST_VARS[country]', f_city='$HTTP_POST_VARS[city]', f_zip='$HTTP_POST_VARS[zip]', f_street='$HTTP_POST_VARS[street]', f_house='$HTTP_POST_VARS[house]', f_flat='$HTTP_POST_VARS[flat]', f_home_tel='$HTTP_POST_VARS[home_tel]', f_working_tel='$HTTP_POST_VARS[working_tel]', f_mobile_tel='$HTTP_POST_VARS[mobile_tel]', f_email='$HTTP_POST_VARS[email]', f_additional_info='$HTTP_POST_VARS[additional_info]', f_date_time=NOW(), f_photo='".mysql_escape_string($buffer)."'
WHERE (f_id='$id')";
  $result = mysql_query($query);

Если не заполнено поле фото, то он ругается

Notice:  Undefined variable:  buffer in D:\SERVER\notebook\edit_contact.php on line 290

Можно ли от этого избавиться?

   
 
 автор: cheops   (28.03.2006 в 14:01)   письмо автору
 
   для: juliya   (28.03.2006 в 13:56)
 

Notice является своеобразным советом и выводится, когда выставлена максимальная чувствительность PHP к ошибкам - её следует понизить, как это сделано на всех хостингах, иначе они не дадут работать. Для этого, следует выставить соответствующее значение для директивы error_reporting http://www.softtime.ru/info/articlephp.php?id_article=23, в конфигурационном файле php.ini
error_reporting = E_ALL & ~E_NOTICE  

Так же можно изменить уровень обработки ошибок локально, для этого в начало скрипта следует поместить функцию
<?php 
Error_Reporting
(E_ALL & ~E_NOTICE); 
?>

В качестве параметра, которой передать соответствующий уровень обработки ошибок.

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=4985

   
 
 автор: Trianon   (28.03.2006 в 14:43)   письмо автору
 
   для: cheops   (28.03.2006 в 14:01)
 

По-моему, это был как раз один из тех случаев, когда warning предотвратил зарывание ошибки в логике скрипта в трясину наслоений исправлений этого скрипта.
Вот сижу теперь и думаю, а стоит ли отключать эти самые Warning'и....

   
 
 автор: cheops   (28.03.2006 в 14:59)   письмо автору
 
   для: Trianon   (28.03.2006 в 14:43)
 

По уму конечно их не стоил бы отключать, но для их устранения придётся шибко код расширять...

   
 
 автор: Trianon   (28.03.2006 в 14:04)   письмо автору
 
   для: juliya   (28.03.2006 в 13:56)
 

Если не заполнено фото, то всю конструкцию
, f_photo='".mysql_escape_string($buffer)."' 

нужно из запроса выкинуть. Иначе Вы разрушите старую фотографию.

   
 
 автор: Trianon   (28.03.2006 в 14:11)   письмо автору
 
   для: Trianon   (28.03.2006 в 14:04)
 

$buffer = '';
if(isset($_FILES['photo']) && !empty($_FILES['photo']['tmp_name'])) 

  ini_set("max_execution_time", 999999); 
  $photo = $_FILES['photo']['tmp_name'];   
  // otkrivaem 
  $file = fopen($photo, "rb");   
  // chitaem 
  $buffer = fread($file, filesize($photo)); 
  $buffer = ", f_photo='".mysql_escape_string($buffer)."'"; 
  // zakrivaem 
  fclose($file); 

и

 $query = "UPDATE vsm_notebook SET f_surname='$HTTP_POST_VARS[surname]', f_name='$HTTP_POST_VARS[name]', f_patronymic='$HTTP_POST_VARS[patronymic]', f_country='$HTTP_POST_VARS[country]', f_city='$HTTP_POST_VARS[city]', f_zip='$HTTP_POST_VARS[zip]', f_street='$HTTP_POST_VARS[street]', f_house='$HTTP_POST_VARS[house]', f_flat='$HTTP_POST_VARS[flat]', f_home_tel='$HTTP_POST_VARS[home_tel]', f_working_tel='$HTTP_POST_VARS[working_tel]', f_mobile_tel='$HTTP_POST_VARS[mobile_tel]', f_email='$HTTP_POST_VARS[email]', f_additional_info='$HTTP_POST_VARS[additional_info]', f_date_time=NOW() $buffer 
WHERE (f_id='$id')"; 
  

   
 
 автор: Trianon   (28.03.2006 в 13:49)   письмо автору
 
   для: juliya   (28.03.2006 в 13:24)
 

Можно. Для этого нужно в форму добавить еще одно поле. Скрытое.
<form enctype=multipart/form-data method="post">
  <input type=hidden name=id value=<?echo $id?> >

   
 
 автор: juliya   (28.03.2006 в 14:22)   письмо автору
 
   для: Trianon   (28.03.2006 в 13:49)
 

Ура!!! Всем Спасибо!!! Все работает!!! Вы просто гении!!!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования