4

次のようなMySQLテーブルがあります。

index  |  tag  |  posts
-------------------------
  1    | cats  |   9,10
  2    | a cat |   9,10
  3    | kitty |   9,10
  4    | meow  |   9,10

検索クエリに一致する行を返そうとしています。シンプルな を使用して検索パラメーターを渡しました?search=cats。これは私が使用しているPHPです:

$search = $_GET['search'];
$query  = mysql_query("SELECT * FROM tags WHERE tag = '$search'");
echo(mysql_num_rows($query));
$result = mysql_fetch_array($query);
$print  = $result['posts'];
echo($print);

ただし、mysql_num_rows($query)は 0 を出力し、$printNULL を返します。で確認できます($print == "")。TRUE と評価され、mysql_num_rows($query)4 が返されます。検索クエリをテーブルにないものに設定しようとしたところ、期待どおりに FALSE が返されました。も削除しようWHERE tag = '$search'としましたが、本来のようにテーブルが返されます。

私が見落としているものはありますか?

編集

みんなのアドバイスを受けて、私が今使っているコードは次のとおりです。

$search = mysql_real_escape_string($_GET['search']);
var_dump($search); //prints   string(4) "cats"   just like it should
$queryText = "SELECT * FROM tags WHERE tag = '%".$search."%'";
echo($queryText); //SELECT * FROM tags WHERE tag = '%cats%'
$query  = mysql_query($queryText) or die(mysql_error()); //no error
$rows   = mysql_num_rows($query); //this returns 0 and I know it should match 1 row
echo('rows: '.$rows);
$result = mysql_fetch_array($query);
$print  = $result['posts'];
echo($print); //empty

まだ同じ問題があります。行のmysql_query代わりに NULL を返すか、一致しない場合は FALSE を返します。

(将来的にはmysqliAPI を使用しますが、このプロジェクトを で終了したいと思いmysqlます。提案とアドバイスに感謝します)

4

5 に答える 5

1

このコードを今すぐ試してください。

PHP で何かをデバッグしたい場合は、 var_dump ではなく echo を使用する方が速いこと思い出しください。また、mysql_api は非推奨であるため、避ける必要があります。PHP.net では PDO の代わりにPDO を使用してください。

var_dump($_GET); // Just for debuggin if as something

$search = $_GET['search'];
$query  = mysql_query("SELECT * FROM tags WHERE tag = '".mysql_real_escape_string($search)."'");
// echo(mysql_num_rows($query));
$result = mysql_fetch_array($query);
var_dump($result);
//$print  = $result['posts'];
//echo($print);
于 2013-02-01T10:30:07.063 に答える
0

WHERE tage ='$ search'を削除すると、mysql_fetch_arrayがwhileループにないため、テーブルを正常に返すことができません...しかしそれは別として...

// make sure before you execute the code to check that $_GET['search'] is not empty

// start with escaping the search-value (for mysql-injection)
$search = msyql_real_escape_string($_GET['search']);

// changed the query so it searches for tags containing the search value.
// if you would have records with tags "blue cat" and "red cat" it shows them both
// when searching for "cat"
$query  = mysql_query("SELECT * FROM tags WHERE tag LIKE '%".$search."%'");

// put the number of rows in a var
$num = mysql_num_rows($query);

// check this var if it's not 0
if ($num != '0'){
    while ($row = mysql_fetch_array($query){
        echo $row['posts'];
        // etc...
    }
} else {
    // 0 rows found
    echo "nothing found";
}
于 2013-02-01T10:43:32.140 に答える
0

わかりましたので、あなたが行った上記の編集を参照した後、ここに解決策があります

ワイルドカード「%」を使用する場合は、「=」の代わりに「LIKE」を使用してください

したがって、クエリは次のようになります

$queryText = "SELECT * FROM tags WHERE tag LIKE '%" . $search . "%'";

[ローカル システムでまったく同じデータベースを作成し、提供されたのと同じコードを実行しました. 上記の変更を行った後, 期待どおりに実行されます]

于 2013-02-01T10:37:56.680 に答える
0
$search = $_GET['search'];
echo $select_query="SELECT * FROM tags WHERE tag = '".mysql_real_escape_string($search)."'";
$query  = mysql_query($select_query);
echo(mysql_num_rows($query));
while($result = mysql_fetch_array($query))
{
  print_r($result);
}
于 2013-02-01T10:32:54.420 に答える