循环访问数据库记录

时间:2017-05-19 21:38:11

标签: php

我试图遍历所有用户。

首先我获取用户:

include 'database.php';
$records = $conn->prepare('SELECT username FROM users WHERE role = :role');
$user = "user";
$records->bindParam(':role', $user); 
$records->execute();
$results = $records -> fetchAll();

我得到所有这样的用户:

foreach( $results as $row ) {
echo $row[0]."</br>";
}

结果是:

Madses
hans
henk
Piet
Peter
Frek
desley

下面我有另一个代码如下:

foreach( $results as $row ) {
echo $row[0]."</br>";
}

$array = $row;

function getFirstValues(&$array, $amount){
    for($i=0; $i<$amount; $i++){
        echo $array[0];
        $shift = array_shift($array);
        array_push($array, $shift);
    }
    echo "<br />";
}

getFirstValues($array, 4);
getFirstValues($array, 4);
getFirstValues($array, 4);
getFirstValues($array, 4);
getFirstValues($array, 4);

但这回应了:

desley desley desley desley 
desley desley desley desley 
desley desley desley desley 
desley desley desley desley 
desley desley desley desley 

这不是应该的样子。它应该从名字开始,然后是第二个名字,依此类推。任何想法为什么这不符合我的要求?

所需的输出应为:

madses hans henk piet
peter frek desley madses 
hans henk piet peter 
frek desley madses hans 
henk piet peter frek 

3 个答案:

答案 0 :(得分:4)

当您执行$array = $row;时,您已将$array设置为结果集中的最后一行,因此稍后当您在getFirstValues($array, 4);中使用它时,您才会正常工作那一行。首先,不要这样做。 :)你可以改用getFirstValues($results, 4);

之后您遇到的问题是,在getFirstValues函数中,$array[0]将是一个数组(一行)而不是一个字符串。如果您将其更改为$array[0][0],它将从该行获取字符串,然后您应该获得您期望的输出。

一些额外的建议 - 完全可选,因为你已经有了一些有用的东西。

使用$results = $records->fetchAll(PDO::FETCH_COLUMN);获取字符串数组而不是数组数组可以简化操作,因为您无论如何只选择单个列。

此外,您可以通过使用一点数学来避免大量array_shift / array_push函数调用,以实现您正在进行的循环数组访问。

$rows = 5;
$cols = 4;

$area = $rows * $cols;
$size = count($results);

for ($i=0; $i < $area; $i++) {
    echo $results[$i % $size] . ' ';
    if (($i + 1) % $cols == 0) echo '<br>';
}

答案 1 :(得分:1)

如此简单,请尝试:

    include 'database.php';
    $records = $conn->prepare('SELECT username FROM users WHERE role = :role');
    $user = "user";
    $records->bindParam(':role', $user); 
    $records->execute();
    $results = $records -> fetchAll();
    I get all the users like this:

function getFirstValues(&$array, $amount){
    $i = 0;
    foreach($array as $row ) { 
        if ($i != 0 && $i % ($amount-1) == 0) echo $row[0],'</br>';
        else echo $row[0];
        $array[$i] = (isset($array[$i+1])) ? $array[$i+1] : $array[0];
        $i++;
    }
    echo $names;
}

getFirstValues($results, 4);
getFirstValues($results, 4);
getFirstValues($results, 4);
getFirstValues($results, 4);

您需要享受引用结果数组的绝佳主意!

答案 2 :(得分:1)

替换

foreach( $results as $row ) {
    echo $row[0]."</br>";
}

$array = $row;

$array = array();
foreach( $results as $row ) {
    $array[] = $row[0];
}

您只获取数据集中的姓氏,因为目前您要将$row分配给$array,并且在for循环后,$row包含最后一行