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

Форум MySQL

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Редактирование записи (продолжение)

Сообщения:  [1-10]    [11-20]  [21-27] 

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

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

   
 
 автор: 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 в 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 в 15:40)   письмо автору
 
   для: Сквиртел13   (05.07.2006 в 15:33)
 

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

   
 
 автор: Сквиртел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:30)   письмо автору
 
   для: Сквиртел13   (05.07.2006 в 15:07)
 

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

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

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

   
 
 автор: 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 в 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?
Заранее спасибо!

   

Сообщения:  [1-10]    [11-20]  [21-27] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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