sql限制无法显示第一行[重复]

Posted

技术标签:

【中文标题】sql限制无法显示第一行[重复]【英文标题】:sql limit fail to display first row [duplicate] 【发布时间】:2020-04-02 09:33:11 【问题描述】:

我有一个如下所示的 SQL 查询:

    `SELECT * FROM table LIMIT 5;`

其实我用的是mysql的免费员工数据库,查询是:

    `SELECT * FROM employees LIMIT 5;`

现在我有一个 php 函数,它将选定的数据输出到一个 html 表中,如下所示:


function outputTable($query, $link)
     //Verbindung zur Datenbank inkludieren
    require_once('./config.php');
    //auffangen der Rückgabe
    $erg = mysqli_query($link, $query);
    //bestimmt Anzahl der Spalten (aocol = Amount Of COLumns)
    //counts the amount of columns
    $aocol = count(mysqli_fetch_array($erg, MYSQLI_NUM));
    //table head
    $head = "";
    for($x = 0; $x < $aocol; $x++) 
        //legt alle Informationen des Feldes $x in $finfo, darunter auch den Namen der Spalte.
        //puts all information of the field $x in $finfo, also the name of the column
        $finfo = mysqli_fetch_field_direct($erg, $x);
        //Schreibt die Kopfzeile der Tabelle
        //writes the table's head
        $head .= "<th>".$finfo->name."</th>";
    
    //only if style.css included-->irrelevant
    echo '<div class="table"><table id="table">';
    //output of table's head
    echo "<th>$head</th>";
    //output of table's body --> here must be the bug, I think
    while($zeile = mysqli_fetch_array($erg, MYSQLI_NUM)) 
        //new tablerow
        echo "<tr>";
        //filling the row
        foreach($zeile as $feld) 
            //format for numbers
            $ra = preg_match('/^\d+$/',$feld) ? ' align="right"' : '';
            //displaying table data
            echo "<td$ra>".$feld."</td>";
        
    
    //closing table and layout
    echo '</table></div>';

我的问题是写了第 2-5 行,但缺少第一行... 如果你执行查询,你应该得到这样的结果:

| emp_no | 
|  10001 | 
|  10002 | 
|  10003 | 
|  10004 | 
|  10005 |

我实际上只得到了 emp_nos 10002-10005。

【问题讨论】:

我得到:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'order by emp_no' at line 1 我的错误,错误的方式.. SELECT * FROM table ORDER BY emp_no LIMIT 5; 因为它是:'Select * from table order by emp_no limit 5;'但它仍然是相同的结果,所以第一行丢失了 【参考方案1】:

当你打电话时......

$aocol = count(mysqli_fetch_array($erg, MYSQLI_NUM));

这实际上是读取第一行,因此它不再可用于以下循环。

我建议重组你的代码,以便在主读取循环中构建头部,但前提是 $head 为空...

//table head
$head = "";

//only if style.css included-->irrelevant
echo '<div class="table"><table id="table">';
//output of table's body --> here must be the bug, I think
while($zeile = mysqli_fetch_array($erg, MYSQLI_NUM)) 
    if ( empty ($head) )    
        //counts the amount of columns
        $aocol = count($zeile);
        for($x = 0; $x < $aocol; $x++) 
            //legt alle Informationen des Feldes $x in $finfo, darunter auch den Namen der Spalte.
            //puts all information of the field $x in $finfo, also the name of the column
            $finfo = mysqli_fetch_field_direct($erg, $x);
            //Schreibt die Kopfzeile der Tabelle
            //writes the table's head
            $head .= "<th>".$finfo->name."</th>";
        
        //output of table's head
        echo "<th>$head</th>";
    
    //new tablerow
    echo "<tr>";
    //filling the row
    foreach($zeile as $feld) 
        //format for numbers
        $ra = preg_match('/^\d+$/',$feld) ? ' align="right"' : '';
        //displaying table data
        echo "<td$ra>".$feld."</td>";
    

另外,如果您将 MYSQLI_NUM 更改为 MYSQLI_ASSOC,那么您可以只使用键名作为列名并删除额外的 API 调用...

while($zeile = mysqli_fetch_array($erg, MYSQLI_ASSOC)) 
    if ( empty ($head) )    
        foreach ( $zeile as $name => $value )   
            $head .= "<th>".$name."</th>";
        
        //output of table's head
        echo "<th>$head</th>";
    

【讨论】:

【参考方案2】:

mysqli_fetch_array 已经以数组的形式获取结果。

我怀疑它在 fetch 之后移动了 mysql 游标,这就是您缺少第一行的原因。

一个更简单的解决方案可能是这样的:

function outputTable($query, $link) 
    require_once('./config.php');
    $erg = mysqli_query($link, $query);
    $result = mysqli_fetch_array($erg, MYSQLI_ASSOC);
    $aocol = count($result);
    $head = "";
    foreach($result as $row) 
        $head .= '<th>' . $row['name'] . '</th>';
    
    echo '<div class="table"><table id="table">';
    echo "<th>$head</th>";
    foreach($result as $row) 
        echo '<tr>';
        foreach($row as $field) 
            $ra = preg_match('/^\d+$/',$field) ? ' align="right"' : '';
            echo "<td$ra>".$field."</td>";
        
    
    echo '</table></div>';

【讨论】:

【参考方案3】:

您应该使用这样的查询来获取所有结果:

$query = "SELECT * FROM table ORDER BY  `id` LIMIT 0, 5";

这只会为您提供前 5 个结果,以便您可以做出更多结果:

$query = "SELECT * FROM table ORDER BY  `id` LIMIT 5, 100";

或者这个:

$query = "SELECT * FROM table ORDER BY `id` DESC LIMIT 5";

【讨论】:

其实我觉得整个循环里面有某种bug,但是我找不到 试一试我的最后一个查询示例,告诉我你得到了什么回报

以上是关于sql限制无法显示第一行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Android_5_学习《第一行代码》的使用摄像头和相册无法显示图片问题解决

无法将 SQL 数据库表显示到 PHP 页面

git 无法暂存文件,将所有文件显示为重复,但字符大小写不是问题

无法在 Angularjs 重复指令中显示 WEBAPI 数据

用于获取重复记录并在 Gridview 中显示为一行的 SQL 查询

sql语句查询如何显示第一条数据