准备好的语句结果在查询中

时间:2014-05-14 12:09:59

标签: php mysql sql arrays prepared-statement

将我的正常SQL查询转换为准备好的语句,但现在我想实现一个函数,我不确定如何。以下是我目前的代码:

$stmt = $db->stmt_init();

$query = "pretty long query...";

$stmt->prepare($query);

  $stmt->bind_param('ssii', $dienstenpage, $huidigegemeente, $startpoint, $limit);

  $stmt->execute();


  $stmt->bind_result($prepid, $prephoofdrubriek, $prepplaats, $prepbedrijfsnaam, $prepgemeente, $prepbedrijfsomschrijving, $prepbedrijfsslogan, $prepstraatnaam, $prephuisnummer, $preppostcode, $preptelefoonnummer, $prepfax, $prepemail, $prepwebsite, $prepbedrijfslogo, $prepdubb);

  $stmt->store_result();

  $numrows = $stmt->num_rows;



   while($stmt->fetch()) {

Here appears a nice div with all the data for every result (row)

}

所有工作都很好,那里没有hick-up。但是,对于某些页面,我想要将结果的前20行(仅前20个!)洗牌。感谢其他人的帮助,我了解到最好的方法是将结果放入查询中并执行此操作:

$first20 = array_splice($allResults,0,20);
shuffle($first20);
array_splice($allResults,0,0,$first20);

但是,我不确定如何将结果放入数组中?我应该能够在while循环中执行此操作($ stmt-> fetch),但不确定如何?一旦结果在数组中,我可以使用上面的代码对其进行切片,将其放回到数组中并以新的顺序显示结果。如何在数组中插入行?

答案是(完成的代码):

 $array = array();

    while($stmt->fetch()) { 
    $array[] = array('prepid'=>$prepid, 'prephoofdrubriek'=>$prephoofdrubriek, 'prepplaats'=>$prepplaats, 'prepbedrijfsnaam'=>$prepbedrijfsnaam);
    }

    $first20 = array_splice($array,0,20);
    shuffle($first20);
    array_splice($array,0,0,$first20);

    $number = count($array);

    $cnt = $number; // if you wanted to get them all you could set it to $cnt = array_count($array);
        for ($i=0; $i<=$cnt; $i++) {
        echo $array[$i]['prepid'];
        echo "<Br />";
   }

4 个答案:

答案 0 :(得分:2)

我要做的就是像你说的那样将它全部放入一个数组中,然后将其回显。

$array = array();

while($stmt->fetch()) { 
    $array[] = array('prepid'=>$prepid, 'prephoofdrubriek'=>$prephoofdrubriek, 'prepplaats'=>$prepplaats, 'prepbedrijfsnaam'=>$prepbedrijfsnaam);
}

我只在数组中加入一些来演示如何操作。

然后为了获取数据,我会使用for循环。

   $cnt = 20; // if you wanted to get them all you could set it to $cnt = array_count($array);
   foreach ($i = 0; $i <= $cnt; $i++) { 
        echo $array[$i]['prepid'];
   }

答案 1 :(得分:1)

您可以执行以下操作

$arr_val=array();

while($stmt->fetch()) {
    $arr_val[] = $stmt->fetch() //or your result row;
}

$sliced_arr = array_slice($arr_val, 0, 20);
array_splice($arr_val, 0, 20);
shuffle($sliced_arr);
$arr_new_val = array_merge($sliced_arr,$arr_val);
print_r($arr_new_val);

答案 2 :(得分:1)

$stmt->fetch()保存到变量中并添加parameter

$result = $sth->fetch(PDO::FETCH_ASSOC);

对于多行:

 while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
    {
       $result = array_push($result, $row);
    }

现在您已经提取了数据,可以array_splice

$first20 = array_splice($result ,0,20);
shuffle($first20);
array_splice($result,0,0,$first20);

答案 3 :(得分:1)

为什么不简单地使用fetchAll()

$arr = array_slice($stmt->fetchAll(), 0, 20);
shuffle($arr);
foreach ($arr as $a)
{
    echo $a['prepaid'];
}

如果占用大量内存(因为fetchAll()返回所有行),您可以使用fetch()但限制为20(无需切片)。

$i = 0;
$arr = array();

while (($row = $stmt->fetch()) && $i++ < 20)
{
    $arr[] = $row;
}

shuffle($arr);

foreach ($arr as $a)
{
    echo $a['prepaid'];
}