• ベストアンサー

MySQLに同じデータがあるかどうか確認する方法

掲示板でスパム投稿を排除するために、同じ投稿内容は投稿できないようにしたいと思っています。 データはMySQLにありまして、bbsというテーブル名でpostdataというフィールド名を利用しています。 $sql = "select * from bbs where postdata = '$postdata'"; $res = db_query($sql, $conn); $rows = mysql_num_rows($res); if ($rows > 0) { exit; } 投稿する前にDBをチェックして同じ投稿だったらexitするようにしているつもりですが、同じ投稿内容なのにチェックされずに投稿されてしまいます。 何がいけないのでしょうか?postdata = '$postdata'" 日本語の文字列をチェックするのは無理があるのでしょうか。

  • yes87
  • お礼率74% (29/39)
  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

とりあえず、実際に実行しているSQL文を出力してデバッグしてみては。 わたしだったら、余分な空白や改行を除去したうえで、md5値を計算して、それに対してUNIQ制約をつけるとか。

参考URL:
http://wpedia.search.goo.ne.jp/search/SQL%A5%A4%A5%F3%A5%B8%A5%A7%A5%AF%A5%B7%A5%E7%A5%F3/detail.html?from=websearch
yes87
質問者

お礼

osamuyさんのやり方に関する質問をしたいのですが、このまま続けていいのか分からないので、一旦締め切ってから再度質問させて頂きます。 どうもありがとうございました。

yes87
質問者

補足

var_dumpで確認してみたら、同じ投稿であるにも関わらず、$rowsが常に0でした。変数にはデータが入っていました。 日本語の文章をそのままデータベースに問い合わせるのは無理なのでしょうか。 なんか根本的に間違っていることをしている気がしてきました。

その他の回答 (1)

noname#45409
noname#45409
回答No.2

これだとスペース1つでもあれば一致しませんからね。まぁ、SPAM投稿の予防にはならないのではないでしょうか。 NGワードでscore加算して、scoreが一定以上に達したら投稿をエラー処理するとか・・・もうちょっと仕組みを工夫した方がいいと思いますよ。調整もNGワードとそれに対応させるscore、あと、score閾値で調整できるんで、そこそこ柔軟にできますし。

yes87
質問者

お礼

どうもありがとうございました。

yes87
質問者

補足

NGワードは設定しているのですが、それだとキリがないので、同じ文章を連続して投稿してくるものを排除したいと思いこちらで質問させて頂きました。 今考えると質問がズレていたのかもしれません。

関連するQ&A

  • PHP+MySQLでデータ登録がうまくいかない

    いつもお世話になっています。 早速質問です。 ユーザ登録フォームの作成をしています。 Select文を使って2重登録の確認後、DBに登録するのですが 2重登録はちゃんと機能しているのに、登録が出来ません。 どのようにしたらいいか、アドバイスいただけますか? お手数ですが、よろしくお願いします。 mysql_query("lock tables user_data write"); $sql = "select USER from user_data where USER = '" . $_POST["USER"] . "'"; $res = mysql_query($sql); if (mysql_num_rows($res) > 0) { echo "すでに登録済みです。"; mysql_query("unlock tables"); mysql_close($con); exit; } $sql = "insert into user_data(USER, pass) values ('" . $_POST["USER"] . "','" . $_POST["pass"] . "');"; mysql_query($sql); mysql_query("unlock tables"); mysql_close($con);

    • ベストアンサー
    • MySQL
  • phpでのmysqlからjsonファイルの変換

    <? php   include("mysql2json.class.php");   //MySQL接続設定 define("DBSV", "PHPSRV"); define("DBNAME", "koukin"); define("DBUSER", "root"); define("DBPASS", "");   //MySQL接続 $conn = mysql_connect(DBSV, DBUSER, DBPASS) or die(); mysql_query("SET NAMES utf8",$conn); mysql_select_db(DBNAME, $conn);   //SQLクエリの発行 $num=0; $sql = "SELECT * FROM komento"; $result = mysql_query($sql, $conn); $num=mysql_affected_rows();   // クラスを呼び出して出力 $objJSON=new mysql2json(); print(trim($objJSON->getJSON($result,$num)));   ?> というプログラムをあるサイトを参考にさせてもらってしようさせてもらっているのですが、なぜか実行すると、getJSON($result,$num))); ?>としか出力されません。 どうしてでしょうか?

    • ベストアンサー
    • PHP
  • Mysql用のプログラムをPostgresql用に変えたい

    現在php+PostgreSQLでのアプリケーション制作を勉強中です。 で、参考書にあるMysql用に書かれたプログラムを参考に、PostgreSQL用に書き換える、といった勉強方法をとっているのですが、どうしても直せない箇所があるので、どなたお力添えいただけませんでしょうか? Mysql用サンプル <?php // =========================================== // 設定 // =========================================== // サーバ/データベース/ユーザ/パスワード $sv = "localhost"; $dbname = "xx"; $user = "xxxx"; $pass = "xxxx"; // 表示文字コード define("ENCDISP", "EUC-JP"); // =========================================== //  パラメータの取得 // =========================================== $act = (isset($_REQUEST["act"])) ? $_REQUEST["act"] : ""; // ================================================= //  処理開始 // ================================================= ?> <?php conndb(); ?> <html> <head> <meta http-equiv="content-type" content="text/html; charset=EUC-JP"> <title>アンケート</title> </head> <body> <?php // -- ページ内容の表示 switch ($act) { case "a": // 回答一覧表示 gamen_iti(); break; default: // 質問表示 gamen_q(); } ?> </body> </html> <?php closedb(); ?> <?php // ================================================= // ----- アンケート質問画面 // ================================================= function gamen_q() { global $conn; $sql = "SELECT * FROM an ORDER BY id desc"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); if (mysql_num_rows($res) <= 0) { return; } $row = mysql_fetch_array($res, MYSQL_BOTH); ?> ・・・ 上記の 「if (mysql_num_rows($res) <= 0) { return; } $row = mysql_fetch_array($res, MYSQL_BOTH);」の部分です。 これを単純に↓に変えてみたもののもちろんエラーとなり、 「if (pg_num_rows($res) <= 0) { return; } $row = pgsql_fetch_array($res, PG_BOTH);」 以後、試行錯誤しているのですが、どうにもこうにも打開できません。 どなたか、ぜひとも教えていただければ大変たすかります。 よろしくお願いいたします。 プログラムをスペースの都合上、一部抜粋のような形になっておりますが、もっと続きをみてみないとどうにもならない。。ということであれば、ご一報いただければと存じます。

  • php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

    phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか? 以下記述↓ <? $link = db_con(); //←DB接続 $sql = "select * from tbl where id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ を下記のように『where』以下を$変数にして代入 $変数した場合↓ <? $where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $link = db_con(); //←DB接続 $sql = "select * from tbl where $where "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ どなたかご指摘をお願いします。

  • PHPでデータベース(mySQL)から値を取りだすには

    PHPで値をmySQLに保存するコードを作成するのに 成功したのはいいのですが、値を取り出して 出力するコードがうまく書けません ネットで調べてみたり、参考書を読んで やっているのですがうまくいきません こういうコードを書いたのですが <?php $conn=mysql_connect("localhost", "user", "pass"); if (!$conn) { die('接続失敗です。'.mysql_error()); } mysql_select_db("database", $conn); mysql_query("SET NAMES 'ja-utf8'", $conn); $sql='SELECT caram, FROM table'; $row=mysql_query($sql, $conn); $res=mysql_fetch_assoc($row); echo htmlspecialchars($res, ENT_QUOTES); mysql_close(); ?> どこが間違っているかご指摘いただけると ありがたいです。

    • 締切済み
    • PHP
  • 複数のテーブルのレコードをカウントする方法

    2つのテーブルのレコード数をカウントする方法を教えてください。 $sql = "SELECT * FROM テーブル1 and テーブル2"; $res = mysql_query($sql,$myLink); $num_k = mysql_num_rows($res); こんな感じでカウントできるかと思ったのですが出来ませんでした。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • mysql_query()の結果のメモリ開放について質問です。

    mysql_query()の結果のメモリ開放について質問です。 $res = mysql_query($qer); $num = mysql_num_rows($res); //メモリ開放 mysql_free_result($res); ↑を↓のようにした場合、メモリ開放は不可能なのでしょうか? $num = mysql_num_rows( mysql_query($qer) ); //メモリ開放 ??どうすれば?? ご回答宜しくお願い致します。

    • ベストアンサー
    • PHP
  • MySQLからのデータをページに10件ずつ表示したい

    はじめて質問させて頂きます。今回質問する内容に類似した質問が過去にかなりの件数がありましたが、どうしても解らず質問させて頂く事をお許し願います。 「名前のキーワード」と「年齢の幅」を入力するフォームから成る「form.html」とそのデータを受け取る「search.php」があります。 「search.php」は「名前」と「年齢」のデータが500件ほど格納されているデータベース名「database」からデータを取ってきて、10件ごとに表示をしたいのですが、うまく表示されません。私が書いた「form.html」と「search.php」は以下の通りです。 「form.html」---------------------------- <html> <head> <title>名前と年齢を検索するフォーム</title> </head> <body> <form method="post" action="search.php"> <input type="text" name="name"> <input type="text" name="age_min"> 歳 ~ <input type="text" name="age_max" > 歳 <input type="submit" name="submit" value="検索"> </form> </body> </html> ---------------------------------------- 「search.php」(SELECT文に名前には「あいまい検索」を、年齢には「BETWEEN」を使っています)--------------------------------- <? if (isset($_GET['pos'])){ $offset = $_GET['pos']; } else { $offset = 0; } $ln = 10; //DB接続 $conn = mysql_pconnect ("localhost", "username", "password") or die ('接続できませんでした'); mysql_select_db ("database",$conn); //クエリ生成 $sql = "select name,age from search where name like '%$name%' and age between '$age_min' and '$age_max' limit $offset,$ln"; $res = mysql_query($sql); $num_rows = mysql_num_rows($res); if($num_rows == 0) $message = "該当するデータはありません"; else $message = $num_rows . "件ヒットしました"; echo "検索結果<br>"; echo "$message"; //SELECTで取得したレコードを出力 while($row = mysql_fetch_array($res)){ echo "<table border='1' cellpadding='0' cellspacing='0'>"; echo "<tr>"; echo "<td>".$row[name]."</td>"; echo "<td>".$row[age]."</td>"; echo "</tr>"; echo "</table>"; } //[前へ]リンクの設定 $next_pos = $offset-$ln; if ($next_pos >= 0) { echo("<a href= ".$_SERVER['PHP_SELF']."?pos=$next_pos>[前へ]</a>"); } //[次へ]リンクの設定 $next_pos =$offset+$ln; $sql = "select * from search where name like '%$name%' and price between '$price_min' and '$price_max' limit $next_pos,$ln"; $res =mysql_query($sql); if (mysql_num_rows($res) > 0) { echo("<a href= ".$_SERVER['PHP_SELF']."?pos=$next_pos>[次ヘ]</a><br>"); } ?> ---------------------------------------------------------------- うまく表示されないというのは具体的に言いますと、例えば 検索結果が何百件あると想定される場合でも、いつも「10件ヒットしました」と表示され、その上[次ヘ]をクリックしても「該当するデータはありません」と表示されてしまいます。ちなみにエラー等は出ません。私が書いた上のコードは私なりに色々な参考ページを参照してのものなのですが。 どなたか、上のコードでおかしい箇所などご指摘頂けましたら、幸いでございます。どうぞアドバイスの程よろしくお願い致します。

  • forで無限ループになっていないかどうか

    各アイテムの最新3件だけデータベースに残したいと思い、下記のようにしてみました。 動作を確認したところ問題なかったのですが、何か(無限ループする可能性があるなど)問題があるようでしたら、ご指摘いただけないでしょうか。 よろしくお願いいたします。 for ($num = 1; $num < 21; $num++){ // アイテムが20件ある場合 $sql = "SELECT COUNT(id) AS cnt FROM item where item_id=$num ;"; $res = mysql_query($sql, $conn) or die; $row = mysql_fetch_array($res, MYSQL_ASSOC); $count = $row["cnt"]; if($count<3){ // アイテムが3件より少なかったら何もしない } else{ $delete_count=$count-3; $sql = "delete from item where item_id=$num order by date limit $delete_count;"; $res = db_query($sql, $conn); } }

    • ベストアンサー
    • PHP
  • PHP+MySQLでの検索結果の横並び表示について

    PHP+MySQLでデータベース作成をはじめた初心者です。 検索結果を横並びにしたかったので他ページを参考にやってみました。 横に並べられるようにはなったのですが、検索結果を横並びで、かつ、4こならべると次の行にうつる方法はどうすればいいのでしょうか? データひとつを■とすると ■■■<改行> ■■■<改行> ■■■<改行> といった感じです。 よろしくお願いいたします。 <?php $host = "localhost"; if (!$conn = mysql_connect($host, "ユーザー", "パス")){ die("MySQL接続エラー.<br />"); } mysql_select_db("データベース名", $conn); $sql = "SELECT * FROM 01_table WHERE on ='1'"; $res = mysql_query($sql,$conn); print("<tr>"); while($row = mysql_fetch_array($res)) { print("<td>".$row["■"]); print("</td>"); } mysql_free_result($res); ?> print("</tr>");

    • ベストアンサー
    • PHP

専門家に質問してみよう