2016-10-12 7 views
0

ここに私がしていることがあります。MySQLクエリで何かが返されたかどうかを調べるのに問題がある

  1. $ get_versionのURLに「バージョン」の値があるかどうかを確認しています。
  2. データベースから最新バージョンを取得し、デフォルト変数として設定します。
  3. URL変数が良好な場合は、データベースが存在するかどうかを確認し、適切な変数を設定します。
  4. 存在しない場合は、上記のデフォルト値を使用してください。

常に「不正なクエリセクション」に移動します。どちらかのクエリが間違っているか、if文が機能しません。

ここに私のコードです。また、それを行うクリーナーの方法はありますか?

// Check if there's a version in URL. If not, set to empty. 
$get_version = isset($_GET['version']) ? $_GET['version'] : ''; 


    // Set defaults if nothing in URL 
    $query = "SELECT * FROM sn_hockey_versions ORDER BY version_id DESC LIMIT 1"; 
    mysqli_query($db, $query) or die('Error querying database.'); 
    $result = mysqli_query($db, $query); 

    while ($row = mysqli_fetch_array($result)) { 
     $newest_version_id = $row['version_id']; 
     $newest_sections = $row['sections']; 
    } 

    if (!empty($get_version) && preg_match('/^[0-9.]*$/', $get_version)) { 

     $query = "SELECT version_id, sections FROM sn_hockey_versions WHERE version = '".$get_version."'"; 
     mysqli_query($db, $query) or die('Error querying database.'); 
     $result = mysqli_query($db, $query); 


     if ($row = mysqli_fetch_array($result)) { 

      $set_version = $row['version_id']; 
      $v_sections = $row['sections']; 
      $test = "IT WORKS!!!!"; 

     } 
     else { 
      $set_version = $newest_version_id; 
      $v_sections = $newest_sections; 
      $test = "Bad query"; 
     } 
    } 
    else { 
     $set_version = $newest_version_id; 
     $v_sections = $newest_sections; 
     $test = "Set default"; 
    } 
+0

mysql関数は、失敗するとブール値falseを返します。あなたはそれをチェックすることを心配することはありません。そして、どの行とも一致/変更しない 'select'または' update'クエリは失敗ではないことに注意してください。何も成し遂げられなかった成功したクエリです。 –

答えて

0

条件付きif文は、$ rowsが結果を返したかどうかではなく、mysql_fetch_array($ result)に設定されているかどうかを確認しています。クエリが結果を返す場合、条件文はtrueを返し、$ rowは結果の配列に設定され、ifブロックが評価されます。それ以外の場合、$ rowはnullに設定され、条件はfalseになり、elseブロックが評価されます。

else文が評価されているので、クエリの問題があると考えられます。クエリの問題は、配列の結果を出力することでテストできます。チェックアウトmysqli_num_rowsの詳細については

if (mysqli_num_rows($result) > 0) { 
     $row = mysqli_fetch_array($result) 

:チェックする方法は多数ありますが、クエリは、あなたのコード内での混乱を防ぐために、すべての結果を返す場合、はmysql_num_rowsの値をチェックして、結果をフェッチする前に、よりよい解決策になります

http://php.net/manual/en/mysqli-result.num-rows.phpも参照してください。Whats the proper way to check if mysql_query() returned any results?

あるコードをより効率的に行うため、私が持っている他の勧告を:必要な場合にのみ、デフォルトのバージョンのデータベースを照会します。不要なクエリが多すぎると、データベースのパフォーマンスの問題が発生する可能性があります。これを達成する1つの方法は、デフォルトのバージョンのクエリを関数に配置し、それを「不正なクエリ」の「デフォルトの設定」ブロックでのみ呼び出すことです。私はこれが役立つことを願っています

+0

データを取得する必要がある場合は**信頼できるものはありません**。 num_rowsは役に立たない追加呼び出しを追加するだけで、何も返されません。 –

+1

OPはクエリが何かを返したかどうかを判断する方法を尋ねています。 mysqli_num_rowsはまさに彼が望むものであり、ほとんど役に立たないと私は思っています。結果があれば、結果を取り出すことができます。私は、OPの記事の最後の文で要求されているように、効率改善のための推奨事項も追加しました。 –

+0

彼は無駄な余分な呼び出しなしで結果を取得できます。いくつか余分なコードを提供する前に**現在のアプローチが信頼できないか間違っている理由を説明しなければなりません。** –

0

それはコードの外に成功したかどうかを確認クエリをコピーし、それが結果を返すかどうかを確認するためにphpmyadminの中またはSSHを介して実行します。結果が返ってきたら、コード内のいくつかの停止チェックを入れて、何を得ているのかを確認します。あなたのように

echo '<pre>jwow',print_r($result,1),'</pre>'; 
die('here'); 

あなたが確認したい結果を置くだけです。私は、異なる名前でクエリ結果に名前を付けるのが好きです。 $ defaults_resultsや$ version_resultsのように。それが "悪いクエリ"になっているなら、あなたはそれを試した後にあなたのエラーを見つけたでしょう。 phpmyadminで結果が返ってこない場合は、エラーを読んでください。

関連する問題