Какой будет правильный синтаксис проверки для этих строк? - PullRequest
1 голос
/ 14 июля 2011

Я пишу скрипт, который проверяет папку K: / Comics и вставляет каждое имя + номер в базу данных, имя таблицы = комиксы. Теперь я хотел бы проверить, существует ли этот комикс перед тем, как выполнить запросы на вставку.

Структура таблицы:

CREATE TABLE IF NOT EXISTS `comics` (
  `id` int(100) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `issue` varchar(4) DEFAULT NULL,
  `bio` longtext NOT NULL,
  `pages` int(10) NOT NULL,
  `size` varchar(100) NOT NULL,
  `price` varchar(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 ;

Код:

<?php
    $main_folder = 'K:/Comics/'; // should be K:\Comics\ but I changed it because of the highlighting issue
    $folders = glob($main_folder.'* [0-9]*', GLOB_ONLYDIR);

    $comics_series = array();
    foreach($folders as $folder){
        $comics_series[] = preg_split('/(.+)\s(\d+)/', str_replace($main_folder, '', $folder), -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
    }

    $values = array();
    foreach($comics_series as $pair){
        $values[] = "('".mysql_real_escape_string($pair[0])."', '".((int) $pair[1])."')";
    }

    $query = 'INSERT IGNORE INTO comics (name, issue) VALUES '.implode(',', $values);
    $result = mysql_query($query);
    echo ($result) ? 'Inserted successfully' : 'Failed to insert the values';
?> 

То, что я думал, будет работать, но не работает (все еще добавляет комиксы в БД, которые уже есть):

$query = 'INSERT IGNORE INTO comics (name, issue) VALUES '.implode(',', $values);
$result = mysql_query($query);
echo ($result) ? 'Inserted successfully' : 'Failed to insert the values';

Что я забыл?!? В документации сказано просто добавить туда IGNORE, и это будет работать ...

Ответы [ 5 ]

1 голос
/ 14 июля 2011
<?php
$main_folder = 'K:/Comics/';
$folders = glob($main_folder.'* [0-9]*', GLOB_ONLYDIR);

$comics_series = array();
foreach($folders as $folder){
    $comics_series[] = preg_split('/(.+)\s(\d+)/', str_replace($main_folder, '', $folder), -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
}

$values = array();
foreach($comics_series as $pair){
    // clean the values to protect against SQL injection
    $pair = array(
        mysql_real_escape_string($pair[0]),
        mysql_real_escape_string($pair[1])
    );
    // add it to the values array, for insert
    $values[] = "('".$pair[0]."', '".$pair[1]."')";
}

$query = 'INSERT INTO comics (name, issue) VALUES '.implode(',', $values).' '.
         'ON DUPLICATE KEY UPDATE `issue` = VALUES(`issue`)';
$result = mysql_query($query);
echo ($result) ? 'Inserted successfully' : 'Failed to insert the values';
?>
1 голос
/ 14 июля 2011

Я бы поместил объединенный уникальный индекс в столбцы name и issue таблицы, чтобы обеспечить сочетание этих значений в таблице.

Вызатем можно выполнить следующее и не беспокоиться о двойных записях:

$query = 'INSERT INTO comics (name, issue) VALUES '.implode(',', $values).'
          ON DUPLICATE KEY UPDATE id=id'; //makes sure you don't get an error

Вы также можете использовать оператор INSERT IGNORE (как указано @Dereleased) , чтобы избежать вставки дубликатов (в указанном ранее уникальный индекс ) .

Также см. документацию для оператора ON DUPLICATE KEY UPDATE, это может быть полезно в ситуациях, когда выхотите обновить запись, если она была найдена как дубликат при вставке.

1 голос
/ 14 июля 2011

doesn't work не слишком информативен.

  • Используйте mysql_num_rows вместо == '0', это действительно бессмысленно
  • Вокруг $values.
  • Обернуть значения в скобки
1 голос
/ 14 июля 2011

mysql_query() возвращает ресурс результата, а не целое число или набор значений или что-либо еще.Попробуйте изменить

if ($check_query == '0'){

на

if (mysql_num_rows($check_query) == 0){

Однако я, вероятно, просто использовал бы:

INSERT IGNORE INTO ...

, поскольку это, вероятно, не имеет значения.Проверьте MySQL Синтаксис Вставки для получения дополнительной информации.

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

mysql_query возвращает дескриптор оператора в случае успешного выполнения запроса и логическое значение FALSE в случае сбоя запроса.Вам нужно будет сделать:

$check_query_result = mysql_query(...) or die(mysql_error());

if(mysql_num_rows($check_query_result) == 0) {
   ... comic doesn't exist ...
}

Обратите внимание, что запрос, не возвращающий строк, НЕ является условием сбоя.Это просто результат, в котором не было строк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...