2012-03-22 135 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