Jump to content
  • 0

Ошибка в книге Кевина Янка?


PHPitd
 Share

Question

Здравствуйте, начал изучать 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 я абсолютный новичок, попытки самому решить проблему или найти ошибку результата не дали к сожалению.

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0
Цитата

ну вот и подумайте над тем, откуда у вас взялась не объявленная переменная pdo, из которой вы тянете функцию exec

Думал над этим, но смутило то, что в книге вышеприведённый код из примера представляется как самодостаточный и работающий,поэтому подумал что проблема в чём то ещё, далее в книге также идут подобные примеры, которые вроде как должны работать. Ранее встречалось только такое объявление переменной: $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';

Вам спасибо за подсказку, буду дальше пытаться разобраться в проблеме, а то самообучение застопорилось на этом.

Link to comment
Share on other sites

  • 0

Всё, наконец то разобрался, нашёл решение начав перечитывать книгу с начала. Стал замечать детали на которые при первом прочтении не обратил внимания, это оказывается была только половина необходимого кода:facepalmxd: Приятно блин, а то как заноза уже который день.:D

Link to comment
Share on other sites

  • 0

Приветствую зашедших в данную тему, хоть и сомневаюсь что кто то будет читать столько букв и вникать, но была не была.

В общем столкнулся с очередной проблемой, с которой бьюсь уже неделю почти. В 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 нужного автора, но при нажатии кнопки Подтверждаю, ничего не удаляется и отображается список авторов в первозданном виде.

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy