Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

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

 

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

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

тема: Редактирование записи (продолжение)
 
 автор: Сквиртел13   (04.07.2006 в 19:00)   письмо автору
 
 

Теперь удаление перестало работать.
Вот код:
<html>
<head>
<title>Магазин "Буквофил" - Результаты удаления строки</title>
</head>
<body>
<h1>Магазин "Буквофил" - Результаты удаления строки</h1>

<?php

$isbn=$_POST['isbn'];

if (!$isbn)
echo 'Вы не ввели isbn для удаления <br>';




if (!get_magic_quotes_gpc())
{
$isbn=addslashes($isbn);

}

$link= mysql_connect('localhost', 'Irina13','pdtplf', 'books')

or die("Не соединилось!!!");


print ("Соединение успешно<br/>");

mysql_query("SET NAMES 'cp1251'");



$query="delete from books where isbn=$isbn";

mysql_select_db("books") or die("Не найдена БД");

$result=mysql_query ("$query");

if ($result)
echo "Строка удалена<br>";


?>

<a href="soedinenie-10.php">Посмотреть изменение</a>
</body>
</html>

   
 
 автор: Сквиртел13   (04.07.2006 в 19:11)   письмо автору
 
   для: Сквиртел13   (04.07.2006 в 19:00)
 

А я поняла, просто у меня вместо цифр были буквы в столбце isbn. Поэтому и не удалялось

   
 
 автор: Trianon   (04.07.2006 в 19:15)   письмо автору
 
   для: Сквиртел13   (04.07.2006 в 19:11)
 

теперь показывайте скрипт, который рисует таблицу с книгами.
[url=?id_forum=3&id_theme=20233 ]начало ветки[/url]:
Вам нужно:
1. при выводе строк формировать тэги (a href ) со ссылкой на скрипт, отображающий форму редактирования данных строки. При этом в ссылке нужно передать параметр первичного ключа редактируемой строки. 
2. Написать скрипт, отображающий форму. В его задачу войдет вывести форму с полями, в которых разместить текущие значения строки, ключ которой передан GET-параметром. Значение ключа нужно передать в поле nput type=hidden. Форма должна вызывать скрипт-обработчик. 
3. Написать скрипт-обработчик, который изменял бы данные строки таблицы на те, которые передаются ему в виде POST-параметров, после чего делал бы переход назад на страницу с таблицей строк.


п. 1 Вы сделали.

   
 
 автор: Сквиртел13   (05.07.2006 в 11:09)   письмо автору
 
   для: Trianon   (04.07.2006 в 19:15)
 

Здравствуйте!
Вот код, который рисует таблицу с книгами:
<?



$link = mysql_connect("localhost", "Irina13", "pdtplf")

or die("Не соединилось!!!");


print "Соединение успешно";

mysql_query("SET NAMES 'cp1251'");


mysql_select_db("books") or die("Не найдена БД");

echo "<table border='1' width=10% bgcolor=gold>";
echo "<td>isbn</td>";
echo "<td>author</td>";
echo "<td>title</td>";
echo "<td>price</td>";
echo "<td>id</td>";

$r=mysql_query("select * from books");

for ($i=0; $i<mysql_num_rows($r); $i++)
{ echo "<tr>";

$f=mysql_fetch_array($r);
echo "<td>$f[isbn]";

echo "<td>$f[author]</td>";
echo "<td>$f[title]</td>";
echo "<td>$f[price]</td>";
echo "<td><a href='newbook.html?id=$f[id]'>добавить</a>&nbsp;<a href='delete.html ?id=$f[id]'>удалить</a></td>";
echo "</tr>";
}

echo "</table>";

?>

   
 
 автор: Trianon   (05.07.2006 в 11:17)   письмо автору
 
   для: Сквиртел13   (05.07.2006 в 11:09)
 

итак...
строчку

echo "<td><a href='newbook.html?id=$f[id]'>добавить</a>&nbsp;<a href='delete.html ?id=$f[id]'>удалить</a></td>";

меняем на указанную мной (04.07.2006 в 15:55)

echo "<td><a href='edit_row.php?id=$f[id]' >edit</a></td>"; 

и смотрим, что получилось.

   
 
 автор: Сквиртел13   (05.07.2006 в 11:23)   письмо автору
 
   для: Trianon   (05.07.2006 в 11:17)
 

А ничего не получится, видь файла edit_row.php у меня нет

   
 
 автор: Trianon   (05.07.2006 в 11:24)   письмо автору
 
   для: Сквиртел13   (05.07.2006 в 11:23)
 

Но ссылки-то хотя бы создаются?
А файл сейчас напишем.

   
 
 автор: Сквиртел13   (05.07.2006 в 11:25)   письмо автору
 
   для: Trianon   (05.07.2006 в 11:24)
 

Ссылки создались.

   
 
 автор: Сквиртел13   (05.07.2006 в 11:27)   письмо автору
 
   для: Trianon   (05.07.2006 в 11:24)
 

Вот ссылки:

   
 
 автор: Trianon   (05.07.2006 в 11:45)   письмо автору
 
   для: Trianon   (05.07.2006 в 11:24)
 


<? // editrow.php

$link mysql_connect("localhost""Irina13""pdtplf") or die("Не соединилось!!!");
mysql_query("SET NAMES 'cp1251'"); 
mysql_select_db("books") or die("Не найдена БД"); 

$id = isset($_GET['id']) ? intval($_GET['id']) : 0;

$query "select * from books where id = $id";
$res=mysql_query($query) or die("Ошибка запроса $query " .mysql_error());

if(
mysql_num_rows($res) != 1
  die(
"Ошибка в базе: Запись id=$id не найдена. Или найдена не одна");

$row mysql_fetch_assoc($res);
$isbn '"'.htmlspecialchars($row['isbn']).'"'
$author '"'.htmlspecialchars($row['author']).'"'
$title '"'.htmlspecialchars($row['title']).'"'
$price '"'.htmlspecialchars($row['price']).'"';

echo 
"<form action=update_row.php method=post >
<table><tr><td>Книга</td><td> 
$id </td><input type=hidden name=id   value=$id  ></tr>
<tr><td>ISBN    </td><td> <input type=text name=isbn   value=
$isbn  > </td></tr>
<tr><td>Автор   </td><td> <input type=text name=author value=
$author> </td></tr>
<tr><td>Название</td><td> <input type=text name=title  value=
$title > </td></tr>
<tr><td>Цена    </td><td> <input type=text name=price  value=
$price > </td></tr>
<tr><td>        </td><td> <input type=submit value='Поменять' > </td></tr>
</table></form>"
;

?>

   
 
 автор: Сквиртел13   (05.07.2006 в 11:53)   письмо автору
 
   для: Trianon   (05.07.2006 в 11:45)
 

Я заменила и у меня выписались ошибки:
Notice: Undefined variable: r in z:\home\localhost\www\php and mysql\kod\edit_row.php on line 14

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in z:\home\localhost\www\php and mysql\kod\edit_row.php on line 14
Ошибка в базе: Запись id=888 не найдена. Или найдена не одна

   
 
 автор: Trianon   (05.07.2006 в 11:58)   письмо автору
 
   для: Сквиртел13   (05.07.2006 в 11:53)
 

Ошибся в двух местах. Возьмите текст еще раз. Полностью.

   
 
 автор: Сквиртел13   (05.07.2006 в 12:03)   письмо автору
 
   для: Trianon   (05.07.2006 в 11:58)
 

Да работает спасибо. А с файлом update_row.php как быть?

   
 
 автор: Trianon   (05.07.2006 в 12:16)   письмо автору
 
   для: Сквиртел13   (05.07.2006 в 12:03)
 

п.2 выполнили.
п.3. тоже сейчас нарисуем.

Вы пока готовьте вопросы.

   
 
 автор: Сквиртел13   (05.07.2006 в 12:21)   письмо автору
 
   для: Trianon   (05.07.2006 в 12:16)
 

А я как раз хотела спросить могу ли я Вам по коду задать вопросы)))
Ну тогда сразу после третьего пункта задам.

   
 
 автор: Trianon   (05.07.2006 в 12:43)   письмо автору
 
   для: Сквиртел13   (05.07.2006 в 12:21)
 

<? // update_row.php

$link mysql_connect("localhost""Irina13""pdtplf") or die("Не соединилось!!!");
mysql_select_db("books") or die("Не найдена БД");
mysql_query("SET NAMES 'cp1251'");

if(!isset(
$_POST['id']) || !isset($_POST['isbn']) || !isset($_POST['author'])
      ||!isset(
$_POST['title'])||!isset($_POST['price']) )
      die(
"Ошибка вызова: скрипту переданы не все параметры.");

 
$id   $_POST['id']; $price  $_POST['price'];
 
$isbn $_POST['isbn']; $author $_POST['author']; $title  $_POST['title'];

$id intval($id);
$price doubleval($price);
if (!
get_magic_quotes_gpc())
{
  
$isbn  addslashes($isbn);
  
$authoraddslashes($author);
  
$title addslashes($title);
}

$query "update books set isbn='$isbn', author='$author', title='$title', price=$price where id = $id";

$res=mysql_query($query) or die("Ошибка запроса $query " .mysql_error());

if(
mysql_affected_rows() != 1)
  die(
"Ошибка в базе: изменяемая запись id=$id не найдена.
        Либо найдена и изменена не одна."
);
else
   echo 
"Изменения внесены.
   Для просмотра списка книг перейдите
   <a href=books.php>сюда</a>"
;
?>


в последней строке books.php нужно заменить на имя скрипта, который выводит список книг.
п.3 выполнен.

   
 
 автор: Сквиртел13   (05.07.2006 в 13:22)   письмо автору
 
   для: Trianon   (05.07.2006 в 12:43)
 

Отлично все получилось все меняет!!!! БОЛЬШОЕ СПАСИБО!!!
Меня кстати Ира зовут. Но Вы наверно уже поняли)))
Теперь я осмотрю коды осмыслю их и задам Вам вопросы по ним через некоторое время. Еще раз БОЛЬШОЕ СПАСИБО!!!!!

   
 
 автор: Сквиртел13   (05.07.2006 в 13:36)   письмо автору
 
   для: Сквиртел13   (05.07.2006 в 13:22)
 

Итак начну по порядку:

1. Почему надо было именно строчку echo "<td><a href='edit_row.php?id=$f[id]'

>edit</a></td>"; написать и ?id=$f[id]' это что такое почему именно так?

2. $id = isset($_GET['id']) ? intval($_GET['id']) : 0; что эта за строчка для чего она и почему 0?

3.$row = mysql_fetch_assoc($res);
$isbn = '"'.htmlspecialchars($row['isbn']).'"';
$author = '"'.htmlspecialchars($row['author']).'"';
$title = '"'.htmlspecialchars($row['title']).'"';
$price = '"'.htmlspecialchars($row['price']).
Объясните пожалуйста что делает этот кусок?

4.
$id = intval($id);
$price = doubleval($price);
эти строчки для чего?

5.$query = "update books
set isbn = '$isbn'
, author = '$author'
, title = '$title'
, price = $price
where id = $id";

$res=mysql_query($query) or die("Ошибка запроса $query " .mysql_error());

if(mysql_affected_rows() != 1)
die("Ошибка в базе: изменяемая запись id=$id не найдена.
Либо найдена и изменена не одна."); И этот кусок объясните пожалуйста тоже? Почему именно 1?
Заранее спасибо!

   
 
 автор: Trianon   (05.07.2006 в 14:20)   письмо автору
 
   для: Сквиртел13   (05.07.2006 в 13:36)
 

1.
Потому что строка
echo "<td><a href='newbook.html?id=$f[id]'>добавить</a>&nbsp;<a href='delete.html ?id=$f[id]'>удалить</a></td>";
если судить по словам (newbook, добавить, delete, удалить), создавала ссылки для добавления и для удаления записей, а не для редактирования их.
А это, как я понял, несколько не то, что Вы хотели.

$f['id'] в том контексте - значение поля id, то есть номер строки.

<a href=скрипт?id=номер > - это ссылка на скрипт. При таком вызове скрипту передается GET-параметр id со значением номер. Это должно быть видно при работе в строке адреса браузера.

Почему? Потому что, вызывая скрипт edit_row, ему каким-то образом надо дать знать, какую строку мы хотим менять. Проще всего - передавая номер строки в параметре адреса.

2. эта строчка читается так: переменной id присвоить если передан GET-параметр id, то его целочисленное значение иначе 0.
0 в данном случае будет признаком несуществующей строки, раз уж параметр в скрипт не передали.
Именно 0 выбран потому, что ни одна реальная запись в таблице под номером 0 не фигурирует. Так устроен MySQL - он не позволяет записывать 0 в качестве AUTO_INCREMENT поля.

3.
$row = mysql_fetch_assoc($res);
этот вызов получает (в общем случае очередную, а у нас - единственную) строку результата $res sql-запроса. Получает её в виде массива, где ключами являются поля id, isbn, author, title, price, а в самих элементах записаны соответствующие значения.

Далее нам нужно составить html-форму с полями вида
<input type=text name=title value="строка названия">
Для этого, следует
а) в текстовых значениях все спецсимволы (поскольку мы не знаем, какие символы встретятся в полях) заменить на их html-эквиваленты.
б) обрамить полученные строки кавычками.
позже они будут подставляться в конструкции
echo " .... <input type=text name=title value=$title > .... ";

4.
$id = intval($id);
$price = doubleval($price);
эти вызовы оставляют в переменных только числа, препятствуя попытке передать в параметрах скрипта строки с вредноносными кусками sql-запросов. (Т.н. SQL-инъекции).
Там где нужно передавать текст, для этой цели применяется вызов функции addslashes и обрамление кавычками.

Собственно, вторая из строк - Ваша. Она видна в скрипте (04.07.2006 в 16:48) в следующем фрагменте:
if (!get_magic_quotes_gpc())
{
$isbn=addslashes($isbn);
$author=addslashes($author);
$title = addslashes($title);
$price = doubleval($price);
}

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

5. какой именно кусок? Он довольно большой.

1 - потому, что в результате запроса должна была измениться ровно одна строка.
Если не изменилось ни одной, значит в скрипт вызвали с несуществующим номером строки, что очевидно означает ошибку либо в скрипте либо в базе.
Если изменилось две и более строк, это однозначно признак ошибки в базе: в таблице присутствует несколько строк под одним номером.

   
 
 автор: Сквиртел13   (05.07.2006 в 15:07)   письмо автору
 
   для: Trianon   (05.07.2006 в 14:20)
 

Спасибо за разъяснение. Все вроде понятно.
Ну удаление строки код у меня есть. На Ваш взгляд он правильный?

   
 
 автор: Trianon   (05.07.2006 в 15:30)   письмо автору
 
   для: Сквиртел13   (05.07.2006 в 15:07)
 

На мой - нет. Впрочем, я его не видел.

   
 
 автор: Сквиртел13   (05.07.2006 в 15:33)   письмо автору
 
   для: Trianon   (05.07.2006 в 15:30)
 

Код вот:
<html>
<head>
<title>Магазин "Буквофил" - Результаты удаления строки</title>
</head>
<body>
<h1>Магазин "Буквофил" - Результаты удаления строки</h1>

<?php

$isbn=$_POST['isbn'];

if (!$isbn)
echo 'Вы не ввели isbn для удаления <br>';




if (!get_magic_quotes_gpc())
{
$isbn=addslashes($isbn);

}

$link= mysql_connect('localhost', 'Irina13','pdtplf', 'books')

or die("Не соединилось!!!");


print ("Соединение успешно<br/>");

mysql_query("SET NAMES 'cp1251'");



$query="delete from books where isbn=$isbn";

mysql_select_db("books") or die("Не найдена БД");

$result=mysql_query ("$query");

if ($result)
echo "Строка удалена<br>";


?>

Что не так?

   
 
 автор: Trianon   (05.07.2006 в 15:40)   письмо автору
 
   для: Сквиртел13   (05.07.2006 в 15:33)
 

А как его вызывать?

   
 
 автор: Сквиртел13   (05.07.2006 в 15:45)   письмо автору
 
   для: Trianon   (05.07.2006 в 15:40)
 

Вот так:
<html>
<head>
<title>Магазин "Буквофил" - Форма удаления строки</title>
</head>

<body>
<h1>Магазин "Буквофил" - Форма удаления строки</h1>

<form action="delete_book.php" method="post">
<table border="0">
<tr>
<td>ISBN</td>
<td><input type="text" name="isbn" maxlength="13" size="13"></td>
</tr>


</table>

<input type="submit" value="Удалить">
</form>

</body>
</html>

   
 
 автор: Trianon   (05.07.2006 в 16:18)   письмо автору
 
   для: Сквиртел13   (05.07.2006 в 15:33)
 

Теперь об ошибках в Вашем варианте
>Код вот:

$isbn=$_POST['isbn'];
if (!get_magic_quotes_gpc())
     $isbn=addslashes($isbn);
$query="delete from books where isbn=$isbn";

из этих строк видно, что введенный ISBN не берется в апострофы.
Соответственно, работает этот обработчик лишь тогда, когда значение представляет собой число. А попадись там пробел, тире, любой другой символ - и всё, откажет.
Кроме того, из-за этого в конец SQL-запроса можно дописать чего-нибудь нехорошее.
Например, введя в качестве ISBN
1 or 1

(запрос станет таким: delete from books where isbn=1 or 1 ) можно удалить все книги в таблице.

строку формирования запроса нужно исправить так:
$query="delete from books where isbn='$isbn'";

   
 
 автор: Trianon   (05.07.2006 в 16:05)   письмо автору
 
   для: Trianon   (05.07.2006 в 15:30)
 

Я бы удаление сделал так. Вывод списка:
<? //books.php

$link mysql_connect("localhost""Irina13""pdtplf")or die("Не соединилось!!!");
mysql_query("SET NAMES 'cp1251'");
mysql_select_db("books") or die("Не найдена БД");

echo 
"<table border='1' width=10% bgcolor=gold>";
echo 
"<form action=delete_rows.php method=post>
  <tr><td>Del</td><td>Edit</td><td>isbn</td><td>author</td><td>title</td><td>price</td></tr>\r\n"
;

$r=mysql_query("select * from books");

for (
$i=0$i<mysql_num_rows($r); $i++)
{ echo 
"<tr>";

$f=mysql_fetch_array($r);

echo 
"<td><input type=checkbox name=del[] value=$f[id] ></td>";
echo 
"<td><a href='edit_row.php?id=$f[id]' >$f[id]</a></td>
  <td>
$f[isbn]</td><td>$f[author]</td><td>$f[title]</td><td>$f[price]</td></tr>\r\n";
}
echo 
"<tr>";
echo 
"<td colspan=6> <input type=submit value='Удалить выбранные книги'></td>";
echo 
"</tr>";
echo 
"</form>";
echo 
"</table>";

?>

И собственно обработка:

<? // delete_rows.php


$link mysql_connect("localhost""Irina13""pdtplf") or die("Не соединилось!!!");
mysql_select_db("books") or die("Не найдена БД");
mysql_query("SET NAMES 'cp1251'");

$list = isset($_REQUEST['del']) ? $_REQUEST['del'] : '';
if(!
is_array($list))
   
$list explode(','$list);
foreach(
$list as $i => $id$list[$i] = intval($id);
$list implode(',',$list);
if(
count($list) == 0)
  echo 
"Удалять нечего";
else
{
  
$query "delete from books where id in ($list)";
  
$res=mysql_query($query) or die("Ошибка запроса $query " .mysql_error());
  
$num mysql_affected_rows();
  echo 
"Удалено записей: $num";
}
echo 
"<br>Для просмотра списка книг перейдите <a href=books.php>сюда</a>";

?>

   
 
 автор: Сквиртел13   (05.07.2006 в 17:12)   письмо автору
 
   для: Trianon   (05.07.2006 в 16:05)
 

Хорошо спасибо я посмотрю.
И еще такой вопрос, откуда Вы это все знаете?)) У меня есть книжки и я их читаю, но там этого нет.

   
Rambler's Top100
вверх

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