|
|
|
| Теперь удаление перестало работать.
Вот код:
<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:00)
| | А я поняла, просто у меня вместо цифр были буквы в столбце isbn. Поэтому и не удалялось | |
|
|
|
|
|
|
|
для: Сквиртел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 Вы сделали. | |
|
|
|
|
|
|
|
для: 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> <a href='delete.html ?id=$f[id]'>удалить</a></td>";
echo "</tr>";
}
echo "</table>";
?> | |
|
|
|
|
|
|
|
для: Сквиртел13
(05.07.2006 в 11:09)
| | итак...
строчку
echo "<td><a href='newbook.html?id=$f[id]'>добавить</a> <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>";
|
и смотрим, что получилось. | |
|
|
|
|
|
|
|
для: Trianon
(05.07.2006 в 11:17)
| | А ничего не получится, видь файла edit_row.php у меня нет | |
|
|
|
|
|
|
|
для: Сквиртел13
(05.07.2006 в 11:23)
| | Но ссылки-то хотя бы создаются?
А файл сейчас напишем. | |
|
|
|
|
|
|
|
для: Trianon
(05.07.2006 в 11:24)
| | Ссылки создались. | |
|
|
|
|
|
|
|
для: Trianon
(05.07.2006 в 11:24)
| | Вот ссылки: | |
|
|
|
|
|
|
|
для: 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>";
?>
|
| |
|
|
|
|
|
|
|
для: 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 не найдена. Или найдена не одна | |
|
|
|
|
|
|
|
для: Сквиртел13
(05.07.2006 в 11:53)
| | Ошибся в двух местах. Возьмите текст еще раз. Полностью. | |
|
|
|
|
|
|
|
для: Trianon
(05.07.2006 в 11:58)
| | Да работает спасибо. А с файлом update_row.php как быть? | |
|
|
|
|
|
|
|
для: Сквиртел13
(05.07.2006 в 12:03)
| | п.2 выполнили.
п.3. тоже сейчас нарисуем.
Вы пока готовьте вопросы. | |
|
|
|
|
|
|
|
для: Trianon
(05.07.2006 в 12:16)
| | А я как раз хотела спросить могу ли я Вам по коду задать вопросы)))
Ну тогда сразу после третьего пункта задам. | |
|
|
|
|
|
|
|
для: Сквиртел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);
$author= addslashes($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 выполнен. | |
|
|
|
|
|
|
|
для: Trianon
(05.07.2006 в 12:43)
| | Отлично все получилось все меняет!!!! БОЛЬШОЕ СПАСИБО!!!
Меня кстати Ира зовут. Но Вы наверно уже поняли)))
Теперь я осмотрю коды осмыслю их и задам Вам вопросы по ним через некоторое время. Еще раз БОЛЬШОЕ СПАСИБО!!!!! | |
|
|
|
|
|
|
|
для: Сквиртел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?
Заранее спасибо! | |
|
|
|
|
|
|
|
для: Сквиртел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 - потому, что в результате запроса должна была измениться ровно одна строка.
Если не изменилось ни одной, значит в скрипт вызвали с несуществующим номером строки, что очевидно означает ошибку либо в скрипте либо в базе.
Если изменилось две и более строк, это однозначно признак ошибки в базе: в таблице присутствует несколько строк под одним номером. | |
|
|
|
|
|
|
|
для: Trianon
(05.07.2006 в 14:20)
| | Спасибо за разъяснение. Все вроде понятно.
Ну удаление строки код у меня есть. На Ваш взгляд он правильный? | |
|
|
|
|
|
|
|
для: Сквиртел13
(05.07.2006 в 15:07)
| | На мой - нет. Впрочем, я его не видел. | |
|
|
|
|
|
|
|
для: 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:33)
| | А как его вызывать? | |
|
|
|
|
|
|
|
для: 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)
| | Теперь об ошибках в Вашем варианте
>Код вот:
$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 в 16:05)
| | Хорошо спасибо я посмотрю.
И еще такой вопрос, откуда Вы это все знаете?)) У меня есть книжки и я их читаю, но там этого нет. | |
|
|
|