|
|
|
|
|
для: Trianon
(05.07.2006 в 16:05)
| | Хорошо спасибо я посмотрю.
И еще такой вопрос, откуда Вы это все знаете?)) У меня есть книжки и я их читаю, но там этого нет. | |
|
|
|
|
|
|
|
для: Сквиртел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
(запрос станет таким: delete from books where isbn=1 or 1 ) можно удалить все книги в таблице.
строку формирования запроса нужно исправить так:
$query="delete from books where isbn='$isbn'";
|
| |
|
|
|
|
|
|
|
для: 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>";
?>
|
| |
|
|
|
|
|
|
|
для: 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> | |
|
|
|
|
|
|
|
для: Сквиртел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>";
?>
Что не так? | |
|
|
|
|
|
|
|
для: Сквиртел13
(05.07.2006 в 15:07)
| | На мой - нет. Впрочем, я его не видел. | |
|
|
|
|
|
|
|
для: Trianon
(05.07.2006 в 14:20)
| | Спасибо за разъяснение. Все вроде понятно.
Ну удаление строки код у меня есть. На Ваш взгляд он правильный? | |
|
|
|
|
|
|
|
для: Сквиртел13
(05.07.2006 в 13:36)
| | 1.
Потому что строка
echo "<td><a href='newbook.html?id=$f[id]'>добавить</a> <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: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?
Заранее спасибо! | |
|
|
|
|