PHPitd
Newbie-
Posts
4 -
Joined
-
Last visited
Information
-
Sex
не скажу
PHPitd's Achievements
Explorer (1/14)
0
Reputation
-
Приветствую зашедших в данную тему, хоть и сомневаюсь что кто то будет читать столько букв и вникать, но была не была. В общем столкнулся с очередной проблемой, с которой бьюсь уже неделю почти. В 7 главе вышеописанной книги приступил к созданию простенькой CMS для сайта с шутками, вот оригинальный код контроллёра по управлению авторами шуток: <?php if (isset($_POST['action']) and $_POST['action'] == 'Удалить') { include $_SERVER['DOCUMENT_ROOT'] . '/includes/db.inc.php'; // Получаем шутки, принадлежащие автору try { $sql = 'SELECT id FROM joke WHERE authorid = :id'; $s = $pdo->prepare($sql); $s->bindValue(':id', $_POST['id']); $s->execute(); } catch (PDOException $e) { $error = 'Ошибка при получении списка шуток, которые нужно удалить.'; include 'error.html.php'; exit(); } $result = $s->fetchAll(); // Удаляем записи о категориях шуток try { $sql = 'DELETE FROM jokecategory WHERE jokeid = :id'; $s = $pdo->prepare($sql); // Для каждой шутки foreach ($result as $row) { $jokeId = $row['id']; $s->bindValue(':id', $jokeId); $s->execute(); } } catch (PDOException $e) { $error = 'Ошибка при удалении записей о категориях шутки.'; include 'error.html.php'; exit(); } // Удаляем шутки, принадлежащие автору try { $sql = 'DELETE FROM joke WHERE authorid = :id'; $s = $pdo->prepare($sql); $s->bindValue(':id', $_POST['id']); $s->execute(); } catch (PDOException $e) { $error = 'Ошибка при удалении шуток принадлежащих автору.'; include 'error.html.php'; exit(); } // Удаляем имя автора try { $sql = 'DELETE FROM author WHERE id = :id'; $s = $pdo->prepare($sql); $s->bindValue(':id', $_POST['id']); $s->execute(); } catch (PDOException $e) { $error = 'Ошибка при удалении автора.'; include 'error.html.php'; exit(); } header('Location: .'); exit(); } // Выводим список авторов include $_SERVER['DOCUMENT_ROOT'] . '/includes/db.inc.php'; try { $result = $pdo->query('SELECT id, name FROM author'); } catch (PDOException $e) { $error = 'Ошибка при извлечении авторов из базы данных!'; include 'error.html.php'; exit(); } foreach ($result as $row) { $authors[] = array('id' => $row['id'], 'name' => $row['name']); } include 'authors.html.php'; Он выводит список всех авторов, а рядом 2 кнопки : Редактировать и Удалить (хотел добавить скриншот для наглядности, но выскакивает ошибка при попытке). При нажатии кнопки удалить, автор и все принадлежащие ему шутки удаляются с сайта (и из базы данных соответственно). Далее автор книги просит попробовать самостоятельно изменить код контроллёра так, чтобы при нажатии кнопки Удалить выскакивала таблички просящая подтвердить удаление и уж только после нажатия кнопки подтверждаю, скрипт сработал как и в оригинале. Вот тут то я и запоролся(( Вот что у меня получилось: <?php if (isset($_POST['action']) and $_POST['action'] == 'Удалить') { /////// include $_SERVER['DOCUMENT_ROOT'] . '/includes/db.inc.php'; try { $sql = 'SELECT id FROM author WHERE id = :id'; $s = $pdo->prepare($sql); $s->bindValue(':id', $_POST['id']); $s->execute(); } catch (PDOException $e) { $error = 'Ошибка при извлечении авторов из базы данных!'; include 'error.html.php'; exit(); } $result = $s->fetchAll(); foreach ($result as $row) { $authorid = $row['id']; } include $_SERVER['DOCUMENT_ROOT'] . '/admin/authors/rly.html.php'; if (isset($_POST['rly']) and $_POST['rly'] == 'Подтверждаю') { include $_SERVER['DOCUMENT_ROOT'] . '/includes/db.inc.php'; /////// // Получаем шутки, принадлежащие автору try { $sql = 'SELECT id FROM joke WHERE authorid = :id'; $s = $pdo->prepare($sql); $s->bindValue(':id', $_POST['id']); $s->execute(); } catch (PDOException $e) { $error = 'Ошибка при получении списка шуток, которые нужно удалить.'; include 'error.html.php'; exit(); } $result = $s->fetchAll(); // Удаляем записи о категориях шуток try { $sql = 'DELETE FROM jokecategory WHERE jokeid = :id'; $s = $pdo->prepare($sql); // Для каждой шутки foreach ($result as $row) { $jokeId = $row['id']; $s->bindValue(':id', $jokeId); $s->execute(); } } catch (PDOException $e) { $error = 'Ошибка при удалении записей о категориях шутки.'; include 'error.html.php'; exit(); } // Удаляем шутки, принадлежащие автору try { $sql = 'DELETE FROM joke WHERE authorid = :id'; $s = $pdo->prepare($sql); $s->bindValue(':id', $_POST['id']); $s->execute(); } catch (PDOException $e) { $error = 'Ошибка при удалении шуток принадлежащих автору.'; include 'error.html.php'; exit(); } // Удаляем имя автора try { $sql = 'DELETE FROM author WHERE id = :id'; $s = $pdo->prepare($sql); $s->bindValue(':id', $_POST['id']); $s->execute(); } catch (PDOException $e) { $error = 'Ошибка при удалении автора.'; include 'error.html.php'; exit(); } header('Location: .'); exit(); } } // Выводим список авторов else { include $_SERVER['DOCUMENT_ROOT'] . '/includes/db.inc.php'; try { $result = $pdo->query('SELECT id, name FROM author'); } catch (PDOException $e) { $error = 'Ошибка при извлечении авторов из базы данных!'; include 'error.html.php'; exit(); } foreach ($result as $row) { $authors[] = array('id' => $row['id'], 'name' => $row['name']); } include 'authors.html.php'; } Контроллёр подключает табличку с просьбой подтвердить удаление автора, вот её код: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Подтверждение удаления</title> </head> <body> <h1>Вы действительно хотите удалить этого автора?</h1> <form action="" method="post"> <div> <input type="hidden" name="id" value="<?php echo $authorid; ?>"> <input type="submit" name="rly" value="Подтверждаю"> <input type="submit" name="rly" value="Отклоняю"> </div> </form> </body> </html> И передаёт в скрытоё поле правильный id нужного автора, но при нажатии кнопки Подтверждаю, ничего не удаляется и отображается список авторов в первозданном виде. Если вдруг кто то прочтёт и даже поймёт что я тут понаписал, если это вообще возможно, буду очень благодарен помощи в решении данной проблемы. Сам к сожалению никак не могу понять что не так и почему не работает, потому и написал сюда от отчаяния))). Прошу понять и простить.
-
Всё, наконец то разобрался, нашёл решение начав перечитывать книгу с начала. Стал замечать детали на которые при первом прочтении не обратил внимания, это оказывается была только половина необходимого кода Приятно блин, а то как заноза уже который день.
-
Думал над этим, но смутило то, что в книге вышеприведённый код из примера представляется как самодостаточный и работающий,поэтому подумал что проблема в чём то ещё, далее в книге также идут подобные примеры, которые вроде как должны работать. Ранее встречалось только такое объявление переменной: $pdo = new PDO('mysql:host=localhost;dbname=ijdb', 'ijdbuser', 'mypassword'); Причём, если добавить её в код, к примеру так: <?php try { $sql = 'CREATE TABLE joke( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, joketext TEXT, jokedate DATE NOT NULL ) DEFAULT CHARACTER SET utf8 ENGINE=MyISAM'; $pdo = new PDO('mysql:host=localhost;dbname=ijdb', 'ijdbuser', 'mypassword'); $pdo->exec($sql); } catch (PDOException $e) { $output = 'Ошибка при создании таблицы joke: ' . $e->getMessage(); include 'output.html.php'; exit(); } $output = 'Таблица joke была успешно создана.'; include 'output.html.php'; То скрипт начинает "работать", но очень странно. Всегда выскакивает сообщение из переменной $output в конце, о том, что Таблица joke была успешно создана. И если изменить имя таблицы, она действительно создаётся, если же оставить имя тем же таблица не создаётся и вместо сообщении об ошибке выскакивает всё то же Таблица joke была успешно создана. Причём оно выскакивает, даже если допустить ошибку в команде указывающей на создание таблицы, к примеру: $sql = 'CRAT TABL ok( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, joketext TEXT, jokedate DATE NOT NULL ) DEFAULT CHARACTER SET utf8 ENGINE=MyISAM'; Вам спасибо за подсказку, буду дальше пытаться разобраться в проблеме, а то самообучение застопорилось на этом.
-
Здравствуйте, начал изучать PHP с книги Кевина Янка - PHP и MySQL. От новичка к профессионалу. И всё шло хорошо, пока в главе 4 не наткнулся на такой пример: <?php try { $sql = 'CREATE TABLE joke ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, joketext TEXT, jokedate DATE NOT NULL ) DEFAULT CHARACTER SET utf8 ENGINE=MyISAM'; $pdo->exec($sql); } catch (PDOException $e) { $output = 'Ошибка при создании таблицы joke: ' . $e->getMessage(); include 'output.html.php'; exit(); } $output = 'Таблица joke была успешно создана.'; include 'output.html.php'; Автор пишет, что должно выскочить сообщение о невозможности создании данной таблицы: Ошибка при создании таблицы joke: SQLSTATE[42S01]: Base table or view already exists: 1050 Table ’joke* already exists, так как в предыдущих заданиях эта таблица уже создавалась, но у меня выскакивает такая ошибка: Notice: Undefined variable: pdo in C:\xampp\htdocs\createtable\index.php on line 9 Fatal error: Call to a member function exec() on null in C:\xampp\htdocs\createtable\index.php on line 9 Пожалуйста помогите разобраться в чём проблема и решить её.Извините если вопрос совсем глупый, но в PHP я абсолютный новичок, попытки самому решить проблему или найти ошибку результата не дали к сожалению.