- ベストアンサー
データ入力条件でのデータベース作成の問題
- データ入力条件でのデータベース作成に関する問題が発生しています。
- RSSよりリンクとタイトルを読み込み、DBに入力する際に重複を防ぐ方法を検討中です。
- 現在の方法では$res[$i]が常にtrueになり、重複の判別ができないため、登録がうまくいかない状況です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
PDOはほとんど触ったことが無いので違っていましたらごめんなさい。 環境が無いので動作検証もしてません。 http://www.php.net/manual/ja/pdostatement.execute.php $search->executeの結果返ってくるのはSQLの実行が成功したか失敗したかです。 つまり該当があろうがなかろうがSQLの文法が間違っていないならばTRUEになります。 該当件数を得るならば実行結果をチェックする必要があります。 該当件数を得るために以下のようにしてみてください。 //▼▼▼▼▼検索させるクエリ発行▼▼▼▼▼ $search=$db->prepare("SELECT count(*) as cnt FROM rss where title = ?"); $res[$i]=$search->execute(array($title[$i])); if($res[$i]) { $values=$search->fetch(PDO::FETCH_ASSOC); //該当件数が0件の場合 if($values["cnt"]==0) 後、タイトルは別記事でも重複する可能性があるのでURL(もしくは他にチェックできる項目)を元に 重複チェックをしたほうがよいかと思います。
その他の回答 (3)
- duron
- ベストアンサー率77% (73/94)
ごめんなさい、No.3の回答中の if(!$res) は if($res) が正しいです。
- duron
- ベストアンサー率77% (73/94)
No.1の回答がサポートで内容を確認中ということで現在表示されて 無いのでもう一回書き込んでみようと思います。 (確認中になったのはリンクに「.exe」が含まれてたのが原因なのかな?) No.1でも書きましたがPDOはほとんど扱ったことがないので間違ってたらごめんなさい。 実行環境がないので動作確認もしていないのでおかしなところがあったら直してください。 PDOStatement::executeで戻ってくる値はSQLの実行が成功したか失敗したかというものです。 つまりSQLが文法的に間違っていない場合にはtrueが返ってくることになります。 No.2さんへの補足にあるPDO::queryも同様にSQL異常で無い限りFALSEとはなりません。 ですので該当が何件あったか?という条件でチェックする必要があります。 そこで以下のように変えてみてください。 foreach($rss->item as $data) { $url=$data->link; $title=$data->title; $select="SELECT count(*) as cnt FROM rss where url='$url'"; $res=$db->query($select); if(!$res) { $values=$res->fetch(PDO::FETCH_ASSOC); if($values["cnt"]==0) { $INSERT=$db->prepare("INSERT INTO rss(url,title) VALUES(?,?)"); $INSERT->execute(array($url,$title)); } } }
- shimix
- ベストアンサー率54% (865/1590)
forのLoopn中で、そこまで添え字を使う必要があるんでしょうか?$titleや$urlや$resをあとで配列の状態で使うのなら仕方ありませんけど、少なくとも$resまで配列になっているのは(そのときにチェックするだけなので)意味がないと思います。 for($i=0;$i<count($rss->item);$i++) { $title=$rss->item[$i]->title;//タイトル抽出 $url=$rss->item[$i]->link;//リンク先抽出 //▼▼▼▼▼検索させるクエリ発行▼▼▼▼▼ $search=$db->prepare("SELECT * FROM rss where title = ?"); $res=$search->execute($title); //検索結果が偽の場合 if(!$res) { $INSERT=$db->prepare("INSERT INTO rss(url,title) VALUES(?,?)"); $INSERT->execute(array($url,$title)); } }
補足
添字の部分は最近付けてみたのですが確かに結果は変わりませんでした。 下記内容が何故作動しないのかわかりません。論理的には合ってるはずなのですが。 再度ご覧頂ますよう、宜しくお願い致します。 $rss=simplexml_load_file("http://rss.rssad.jp/rss/impresswatch/pcwatch.rdf"); foreach($rss->item as $data) { $url=$data->link; $title=$data->title; $select="SELECT * FROM rss where url='$url'"; $res=$db->query($select); if(!$res){$insert=INSERT INTO rss(title,url) VALUES(?,?);execute(array($title,$url));} }
お礼
有難う御座いました。「教えてgoo」を今見ました。 「つまり該当があろうがなかろうがSQLの文法が間違っていないならばTRUEになります。」 これが大事でした。いつもTRUEになるのは当然です。貴方の仰るように実行結果を チェックすることで入力の判別が可能になりました。 解決しました、有難う御座います。