Как обеспечить отсутствие существующих заголовков записей при вставке строки в базу данных MySQL с помощью PHP? - PullRequest
1 голос
/ 28 июля 2011

Я использую следующую функцию для вставки данных в базу данных MySQL.

Может ли кто-нибудь обновить его, чтобы было возвращено сообщение об ошибке, если в столбце заголовка уже есть заголовок с именем «My Test Post» (без учета регистра)? (Я не хочу повторяющихся сообщений)

public function insert() {
    // Does the Article object already have an ID?
    if ( !is_null( $this->id ) ) trigger_error ( "Article::insert(): Attempt to insert an Article object that already has its ID property set (to $this->id).", E_USER_ERROR );

    // Insert the Article
    $conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
    $sql = "INSERT INTO articles ( publicationDate, title, summary, content ) VALUES ( FROM_UNIXTIME(:publicationDate), :title, :summary, :content )";
    $st = $conn->prepare ( $sql );
    $st->bindValue( ":publicationDate", $this->publicationDate, PDO::PARAM_INT );
    $st->bindValue( ":title", $this->title, PDO::PARAM_STR );
    $st->bindValue( ":summary", $this->summary, PDO::PARAM_STR );
    $st->bindValue( ":content", $this->content, PDO::PARAM_STR );
    $st->execute();
    $this->id = $conn->lastInsertId();
    $conn = null;
}

Ответы [ 3 ]

3 голосов
/ 28 июля 2011
$sql = "SELECT title from articles where title=:title";
    $st = $conn->prepare ( $sql );
    $st->bindValue( ":title", $this->title, PDO::PARAM_STR );
    $st->execute();
    if($st->rowCount()>0) print "error";
else{

$conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
    $sql = "INSERT INTO articles ( publicationDate, title, summary, content ) VALUES ( FROM_UNIXTIME(:publicationDate), :title, :summary, :content )";
    $st = $conn->prepare ( $sql );
    $st->bindValue( ":publicationDate", $this->publicationDate, PDO::PARAM_INT );
    $st->bindValue( ":title", $this->title, PDO::PARAM_STR );
    $st->bindValue( ":summary", $this->summary, PDO::PARAM_STR );
    $st->bindValue( ":content", $this->content, PDO::PARAM_STR );
    $st->execute();
    $this->id = $conn->lastInsertId();
    $conn = null;

}

для регистра без учета регистра:

$sql = "SELECT title from articles where LOWER(title)=:title";
$st->bindValue( ":title", strtolower($this->title), PDO::PARAM_STR );
1 голос
/ 28 июля 2011

У вас есть несколько вариантов.Один из них состоит в том, чтобы установить уникальное ограничение для рассматриваемой области.Таким образом, MySQL будет выдавать нарушения ограничений, если вы попытаетесь сохранить дубликат.

Индекс UNIQUE создает ограничение, так что все значения в индексе должны быть различны.При попытке добавить новую строку со значением ключа, совпадающим с существующей строкой, возникает ошибка.Для всех механизмов индекс UNIQUE допускает несколько значений NULL для столбцов, которые могут содержать NULL.http://dev.mysql.com/doc/refman/5.1/en/create-table.html

Другая альтернатива - просто выполнить выборку с использованием соответствующего поля и проверить наличие пустого набора результатов.

0 голосов
/ 28 июля 2011

Я не знаком с PDO, но вот обычный запрос mysql, чтобы проверить его

if (mysql_num_rows(mysql_query("SELECT title FROM articles WHERE title = '".mysql_real_escape_string($this->title)."'")){
    die("exists already");
}
...