2011-07-14 10 views
1

私はフォルダ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 ; 

コード:

$query = 'INSERT IGNORE INTO comics (name, issue) VALUES '.implode(',', $values); 
$result = mysql_query($query); 
echo ($result) ? 'Inserted successfully' : 'Failed to insert the values'; 
:私は仕事だろうと思ったがない(まだ、すでに存在しているデシベルに漫画を追加します)どういう

<?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'; 
?> 

私は何を忘れましたか?ドキュメントにはIGNOREを追加するだけでいいです...

答えて

1
<?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'; 
?> 
+0

' $ query = '漫画(名前、問題)の値を挿入します。' .implode( '、'、$ values)。 '重複キー更新でcomicissue = comicissue '; '私は名前をつけて、漫画という名前のユニークなキーを発行します。それでも動作しない場合は、値を挿入するのに失敗します。私はこの新しいコードを今すぐお試しいただきありがとうございます! – rackemup420

+0

'値の挿入に失敗しました。キー '漫画'のための重複したエントリ '2000AD-1722'。それはすでにそこにレコードをスキップしません... – rackemup420

+0

私の答えを更新、確認してください。 – Shef

1

mysql_query()結果のリソースではなく、整数や値のセットなどを返します。しかし

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

if ($check_query == '0'){ 

を変更してみてください、私はおそらくちょうど使用します。

INSERT IGNORE INTO ... 

それはおそらく問題ではありませんので。詳細については、MySQL Insert Syntaxをご覧ください。

+0

'INSERT IGNORE INTO ...'は機能しませんが、既存のすべてのコミックをデータベースに再度追加します。 – rackemup420

+0

次に、一意にする必要のあるフィールドに一意のキーを入れる必要があります。おそらくそうです。 'ALTER TABLE comics ADD UNIQUE KEY name_issue(name、issue)' – Dereleased

0

mysql_queryは、クエリが成功した場合はステートメントハンドルを返し、クエリが失敗した場合はブール型のFALSEを返します。

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

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

ローを返さないクエリは失敗条件ではありません。行を持たないだけの結果です。

1

doesn't workあまりにも有益ではありません。

  • 利用代わり== '0'mysql_num_rowsは、それは本当に無意味だ
  • $values周りに囲む引用符がありません。
  • Iは、テーブル内の別個であることが、これらの値の組み合わせを強制するテーブルのnameissue列にcombined unique indexを置くことになる括弧
+0

空白のページを残しておかなければなりません。 – rackemup420

+0

+1括弧で値をラップするために、私は完全にこれを逃した。私の答えでリンクされているINSERTの構文をチェックしてください。 – Dereleased

1

で値をラップ。

あなたは、その後、二重の記録を心配以下としませんでした:

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

(@Dereleasedで述べたように)また重複の挿入を避けるためにINSERT IGNORE声明を使用することができます(前で指定されたunique index

ON DUPLICATE KEY UPDATEステートメントのドキュメントも参照してください。挿入中に複製として見つかったレコードを更新する場合に役立ちます。

+0

'$ query = 'コミット(名前、問題)VALUES' .implode( '、'、$ values)。 '重複キー更新でcomicissue = comicissue '; '私は名前をつけて、漫画という名前のユニークなキーを発行します。それでも動作しない場合は、値を挿入するのに失敗します。 – rackemup420

+0

'comicissue'が列*(またはその性質のもの)*として存在しないというエラーが出てくると思いますか? 'comicissue = comicissue'の代わりに' id = id'を使って文を使ってみてください。あなたの元の質問のテーブル構造が正しい場合、これは動作するはずです。 –

+0

'ON DUPLICATE KEY UPDATE'ステートメントについて気にしたくない場合は、次のようにすることができます:' $ query = 'IGNORE INTO漫画(名前、問題)VALUES' .implode( '、'、$ values) ; ' –

関連する問題