2012-03-22 134 views
0

我爲我的應用程序之一使用SQLite我有一個條件,我第一次運行查詢,如果它返回結果,然後我檢索其數據,但如果第一個查詢doesn' t返回任何我想運行的另一個查詢,只需從數據庫中選擇任意一行,然後返回結果。在SQLite中沒有數據返回時選擇隨機數據

我已經設計了下面的代碼,它的工作正常,如果它匹配第一種情況下的數據,但這不適用於第二種情況。

$sql_query = "SELECT (select count(*)) as count,* FROM item WHERE combo LIKE '%" . $ans_combo . "%' LIMIT 1;"; 
     $sql_query_bu = "SELECT * FROM item ORDER BY RANDOM() LIMIT 1;"; 
     ini_set('display_errors', true); 
     error_reporting(E_ALL); 

     try { 
      $dbh = new PDO("sqlite:src/appdb.s3db"); 
      $dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $dbh -> setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
      $stmt = $dbh -> prepare($sql_query); 
      $stmt -> execute(); 
      foreach ($stmt as $row) { 
       if ($row['count'] != '1') { 
        echo $sql_query_bu . "<br/>"; 
        $stmt = $dbh -> prepare($sql_query_bu); 
        $stmt -> execute(); 
        foreach ($stmt as $row) { 
         echo $row['name'], " ", $row['name'], " ", $row['name'], "\n"; 
        } 
       } 
       echo "Count: " . $row['count']; 
       echo $row['name'], " ", $row['name'], " ", $row['name'], "\n"; 
      } 
     } catch(Exception $ex) { 
      var_dump($ex); 
     } 

     unset($dbh); 
     unset($stmt); 

請通過此指導我。

謝謝。

回答

2

如果沒有與WHERE子句匹配的記錄,則第一次調用fetch()將返回FALSE。在這種情況下,您只需發送ORDER BY RANDOM() *查詢並獲取第一條記錄。

自包含例如:

<?php 
$pdo = new PDO('sqlite::memory:'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
setup($pdo); 


$stmt = $pdo->prepare('SELECT * FROM soFoo WHERE combo=? LIMIT 1'); 
$stmt->execute(array('comboF')) ; 
$row = $stmt->fetch(); 
$stmt = null; 

if (!$row) { 
    $row = $pdo->query('SELECT * FROM soFoo ORDER BY RANDOM() LIMIT 1')->fetch(); 
} 
var_dump($row); 



function setup($pdo) { 
    $pdo->exec(' 
     CREATE TABLE soFoo (
      combo TEXT, 
      x TEXT 
     ) 
    '); 

    $stmt = $pdo->prepare('INSERT INTO soFoo (combo,x) VALUES (?,?)'); 
    $stmt->execute(array('comboA','A')); 
    $stmt->execute(array('comboB','B')); 
    $stmt->execute(array('comboC','C')); 
    $stmt->execute(array('comboD','D')); 
} 

(*)ORDER BY RANDOM()是例如在MySQL中相當昂貴。我懷疑SQLite對這種情況有一個特殊的例程。更好的搜索ORDER BY RANDOM的好替代方法()

+0

現在工作了,thnx的advce我肯定會尋找一些更好的選擇。謝謝。 :) – Maven 2012-03-22 14:25:12