Идентификатор автоматического приращения не является корректным назначением в базе данных SQL при переполнении стека

Я сбит с толку. Что-то не работает в моей новой CMS, которую я создаю. Я следую этому руководству, но меняю некоторые вещи (включая использование SQLite, а не MySQL) и добавляю больше функциональных возможностей. http://www.elated.com/articles/cms-in-an-afternoon-php-mysql/

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

Вот базовая форма (та же форма, которая отлично подходит для редактирования сообщения):

<h3>Create a blog post</h3>
<form method="POST" action="index.php?action=<?php echo $posts['formAction']; ?>">
<input type="hidden" id="id" name="id" value="<?php echo $posts['post'] -> id; ?>" />
<p>Title: <input id="title" name="title" type="text" placeholder="Enter the post title" required autofocus maxlength="255" value="<?php echo $posts['post'] -> title; ?>"/></p>
<p>Category: <input id="category" name="category" type="text" placeholder="Enter the post category" required maxlength="255" value="<?php echo $posts['post'] -> category; ?>"/></p>
<p>Tags: <input id="tags" name="tags" type="text" placeholder="Enter some tags for the post" required value="<?php echo $posts['post'] -> tags; ?>"/></p>
<p>Summary:</p><textarea id="summary" name="summary" cols="100" rows="5" placeholder="Enter a short summary of the post's content" required><?php echo $posts['post'] -> summary; ?></textarea>
<p>Content:</p><textarea id="body" name="body" cols="100" rows="30" placeholder="Enter the main content of the post" required><?php echo $posts['post'] -> body; ?></textarea>
<p>Publication date: </p><input type="date" id="pubDate" name="pubDate" placeholder="DD-MM-YYYY" required maxlength="10" value="<?php echo $posts['post'] -> pubDate ? date('Y-m-d', $posts['post'] -> pubDate) : ''; ?>" />
<br />
<input id="saveChanges" name="saveChanges" type="submit" value="Create Post"/>
</form>

Это завершает публикацию следующей функции в index.php:

function newPost()
{
$posts = array();
$posts['formAction'] = "newPost";

if (isset($_POST['saveChanges']))
{
$post = new Post;
$post -> storePostValues($_POST);
$post -> insertPost();
header("Location: index.php?status=changesSaved");
}
elseif (isset($_POST['cancel']))
{
header('Location: index.php');
}
else
{
$posts['post'] = new Post;
require('editPost.php');
}
}

И, наконец, соответствующий код в классе Post ():

public function __construct($data = array()) {
if (isset($data['id'])) $this -> id = (int) $data['id'];
if (isset($data['title'])) $this -> title = $data['title'];
if (isset($data['pubDate'])) $this -> pubDate = (int) $data['pubDate'];
if (isset($data['reviseDate'])) $this -> reviseDate = (int) $data['reviseDate'];
if (isset($data['category'])) $this -> category = $data['category'];
if (isset($data['tags'])) $this -> tags = $data['tags'];
if (isset($data['summary'])) $this -> summary = $data['summary'];
if (isset($data['body'])) $this -> body = $data['body'];
if (isset($data['views'])) $this -> views = (int) $data['views'];
if (isset($data['likes'])) $this -> likes = (int) $data['likes'];
if (isset($data['dislikes'])) $this -> dislikes = (int) $data['dislikes'];
}

//Sets object properties from form POST values
public function storePostValues($params) {
$this -> __construct($params);

if (isset($params['pubDate'])) {
$pubDate = explode('-', $params['pubDate']);
if (count($pubDate) == 3) {
list ($d, $m, $y) = $pubDate;
$this -> pubDate = mktime(0, 0, 0, $m, $d, $y);
}
}
if (isset($params['reviseDate'])) {
$reviseDate = explode('-', $params['reviseDate']);
if (count($reviseDate) == 3) {
list ($d, $m, $y) = $reviseDate;
$this -> reviseDate = mktime(0, 0, 0, $m, $d, $y);
}
}
}

public function insertPost() {
if (!is_null($this -> id)) trigger_error("Post::insertPost(): Post ID already assigned.", E_USER_ERROR);
$dblocat = "sqlite:" . $_SERVER['DOCUMENT_ROOT'] . "/cgi-bin/blog.db";
$dbcon = new PDO($dblocat);
$dbcon->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sqlstr = "INSERT INTO posts(title, pubDate, reviseDate, category, tags, summary, body, views, likes, dislikes) VALUES(:title, FROM_UNIXTIME(:pubDate), FROM_UNIXTIME(:reviseDate), :category, :tags, :summary, :body, :views, :likes, :dislikes)";
$preparedstr = $dbcon -> prepare($sqlstr);
$preparedstr -> bindValue(":title", $this -> title, PDO::PARAM_STR);
$preparedstr -> bindValue(":pubDate", $this -> pubDate, PDO::PARAM_INT);
$preparedstr -> bindValue(":reviseDate", $this -> reviseDate, PDO::PARAM_INT);
$preparedstr -> bindValue(":category", $this -> category, PDO::PARAM_STR);
$preparedstr -> bindValue(":tags", $this -> tags, PDO::PARAM_STR);
$preparedstr -> bindValue(":summary", $this -> summary, PDO::PARAM_STR);
$preparedstr -> bindValue(":body", $this -> body, PDO::PARAM_STR);
$preparedstr -> bindValue(":views", 0, PDO::PARAM_INT);
$preparedstr -> bindValue(":likes", 0, PDO::PARAM_INT);
$preparedstr -> bindValue(":dislikes", 0, PDO::PARAM_INT);
$preparedstr -> execute();
$this -> id = $dbcon -> lastInsertId();
$dbcon = null;
}

Так что же происходит? Что ж, каждый раз, когда я сохраняю сообщение, эта ошибка в функции insertPost () вызывается, говоря, что идентификатор сообщения уже существует … но в базе данных установлено автоматическое увеличение, поэтому я не совсем уверен, что происходит. .. Я относительно новичок в PHP и провел часы, пытаясь понять, почему это не работает.

Любой совет будет оценен, и я могу прислать больше кода, если требуется.
Опять же, я основываюсь на этом уроке, но я изменил его и теперь использую SQLite.
http://www.elated.com/articles/cms-in-an-afternoon-php-mysql/

Заранее спасибо,
Ilmiont

0

Решение

Вам просто нужно удалить эту строку, чтобы она заработала (в вашей функции __construct ())

if (isset($data['id'])) $this -> id = (int) $data['id'];

Идентификатор установлен на «автоинкремент», поэтому вы не должны указывать какой-либо идентификатор (база данных выберет его для вас).

Редактировать:

На самом деле вы должны держать эту линию прямо здесь.
Как вы заметили, удаление его помешает вам получить идентификатор сообщения.

Вот мое мнение:
Когда вы создаете новый пост, у вас должно быть несколько таких строк:

// User has posted the article edit form: save the new article
$post = new Post;
$post->storeFormValues( $_POST );
$post->insert();

право ?
А что насчет добавления этого незаданного оператора прямо перед «вставкой»:

// User has posted the article edit form: save the new article
$post = new Post;
$post->storeFormValues( $_POST );
unset($post->id);
$post->insert();

(может потребоваться адаптировать имя переменной в соответствии с вашим кодом)

1

Другие решения

Других решений пока нет …