2017-09-22 5 views
0

"現在のIDの後に何も見つからない場合は、idから検索を開始1"というコードのどこかが必要です。私は問題に出くわしています。たとえば、status == 1のid> 4のIDをクエリしています。id 5に正しいステータスがないため、コードは実行されません。 id#1に戻る必要があります。より高いIDが存在しない場合、id = 1に戻るmysql where節を設定する方法

mysqlのテーブルの一例

----------------------------------------- 
| id | page | status | referral | 
----------------------------------------- 
| 1 | new | 1  | new.php | 
| 2 | used | 0  | used.php | 
| 3 | lease | 1  | lease.php | 
| 4 | video | 0  | video.php | 
| 5 | serv | 0  | serv.php 
----------------------------------------- 

PHPコード

<?php 
$referral = $_SERVER['HTTP_REFERER']; 

$sql = "SELECT * FROM allpages 
     WHERE status = '1' && referral != '$referral' && id > '4'"; 
$result = mysqli_query($conn, $sql); 
$num = mysqli_num_rows($result); 

if (mysqli_num_rows($result) > 0) { 
    // output data of each row 
    while($row = mysqli_fetch_assoc($result)) { 
     if ($row['status'] == 1){ 
      echo "<script> 
        setTimeout(function() { 
        window.location.href = '" . $row['url'] . "'; 
        }, 10000);   
       </script>"; 
     break; 
     }else { echo "no page to display"; } 
    } 
} 
mysqli_close($conn); 
?> 
+0

あなたのSQLは[SQL Injection attacks](https://en.wikipedia.org/wiki/SQL_injection)に脆弱です。準備されたステートメントを使用する。 –

+0

クエリに 'limit 1 'を追加するのは良い考えです。それに加えて、最初の行だけに興味があるので、whileループを削除したいと思うでしょう。だから、 'if'を取り囲む' while'を削除し、 'break'文を削除し、' limit 1'をクエリに追加して、2番目の問題を修正してください。 –

答えて

2

あなたは4よりも第1 id大きいを見つけて、それ以外の場合は、テーブルの最初のidを返すようにしたいです。 (id > 4) DESC、次にid ASCで注文してください。これにより、すべてのIDが> 4がid1の前に表示されるようになります。また、where句からid>4を削除します。例:別にSQLのInjectonsに関するセキュリティ上の理由から

SELECT * FROM allpages WHERE status = '1' ORDER BY (id > '4') DESC, id ASC LIMIT 1 
+0

私は私の答えでこれを考えませんでした。それはずっと楽になります。いい視点ね。 – natheriel

+0

これは最高の答えであることがわかりました。私が追加したのは、クエリの最後にLIMIT 1だけでした。あなたに助けてくれてありがとう! – mrmills129

0

、あなたは与えられた行がない場合は、この場合、最初から

データを取得するための他のSQL要求に持って、理解する必要がありますあなたはSQLを必要とするでしょう

SELECT * FROM allpages WHERE status = '1' && referral != '$referral' ORDER BY id ASC LIMIT 1; 

これは仕事をします。関数を使用してSQLの結果を取得すると、コードがもっとよくなり、少なくなることに注意してください。

<?php 

$referral = mysqli_real_escape_string($conn, $_SERVER['HTTP_REFERER']); 

$sql = "SELECT * FROM allpages WHERE status = '1' && referral != '$referral' && id > '4' LIMIT 1"; 
$result = mysqli_query($conn, $sql); 
$row = mysqli_fetch_assoc($result)); 
if (!empty($row) && is_array($row)) { 
     // result found 
     echo "<script> 
      setTimeout(function() { 
       window.location.href = '" . $row['url'] . "'; 
      }, 10000);  
      </script>"; 
} else { 
     // no result yet, start search from beginning 
     $sql2 = "SELECT * FROM allpages WHERE status = '1' && referral != '$referral' ORDER BY id ASC LIMIT 1"; 
     $result2 = mysqli_query($conn, $sql2); 
     $row2 = mysqli_fetch_assoc($result2)); 
     if (!empty($row2) && is_array($row2)) { 
       // result found by start from beginning 
       $row2 = mysqli_fetch_assoc($result2)); 
       echo "<script> 
        setTimeout(function() { 
         window.location.href = '" . $row2['url'] . "'; 
        }, 10000);  
        </script>"; 
     } else { 
       // noting found from start 
       echo "no page to display"; 
     } 
} 
mysqli_close($conn); 
?> 
+0

私はこのコードを実行することができませんでしたが、いくつか試しましたが、ページにコードをロードしませんでした。私は下のMax Meijerの答えを使って終わった。私はあなたに役立つ時間をかけていただきありがとうございます! – mrmills129

関連する問題