2017-03-17 138 views
0

我有下面的代码,我已经在我的项目中使用了其他地方的变体,并且它可以在其他地方使用,但在这种情况下不起作用。PHP PDO查询返回最后一行

$pdo = new PDO('sqlsrv:server=localhost;Database=db', 'root', 'password'); 
$getResultsInst = $pdo->query("SELECT distinct [names], [id] FROM [tblStaff] ORDER BY [names] asc"); 

while ($result = $getResultsInst->fetch(PDO::FETCH_ASSOC)) { 
    $names = "<tr> 
      <td>".$result['names']."</td> 
      <td>Test</td> 
      </tr>"; 
} 

当我运行在SQL Server Management Studio中查询是大于1点的行返回更多的事情,但是当我运行在HTML的代码...

<table class="table table-bordered"> 
<thead> 
    <tr> 
    <th>Name</th> 
    <th>ID</th> 
    </tr> 
</thead> 
<tbody> 
    <?php echo $names;?> 
</tbody> 

它只是返回SQL查询的最后一行,我无法弄清楚为什么,因为我在别的地方使用了while循环,并为每个获取的结果创建了一个新行。

+2

您正在重设变量$名称,每次循环尝试使用$ names。=“ ... – PhilS

+0

您在下面给出了答案,还有一件事我会建议您使用fetchall,然后使用循环显示结果而是在while循环中使用fetch。在这种情况下,您可以提高代码的性能和最佳实践 –

+0

可能的重复[如何在PHP中将两个字符串结合在一起?](https://stackoverflow.com/questions/8336858/how-结合在一起,两个字符串在一起在PHP) – mickmackusa

回答

1

将此更改为$names =$names .= 您每次都会覆盖值。

$names = "<tr> 
      <td>".$result['names']."</td> 
      <td>Test</td> 
      </tr>"; 

$names .= "<tr> 
      <td>".$result['names']."</td> 
      <td>Test</td> 
      </tr>"; 
+0

非常感谢你Sahil,不能相信我过去看了'。' –

0

使用.=操盘=

0

这不是PDO是造成问题 - 它的分配。您将重新分配相同的变量到其他的东西,以便当它完成时它只有最后一个值。

你真的应该积累的结果。

而不是重复的字符串连接我总是发现它最容易和最易维护的临时数组,然后在最后加入字符串。

当你在这,你真的应该好好利用这样一个事实:PDOStatement对象(PDO::query()函数调用的结果)是迭代优势:你可以在PHP foreach使用它。

这里是一个可能的选择:

<?php 
    // … 

    $names=array(); 
    foreach($getResultsInst as $result) { 
     $names[]="<tr><td>{$result['names']}</td><td>Test</td></tr>"; 
    } 
    $names=implode('',$names); 
?> 

大括号{}周围的变量是有因为插值的字符串中的PHP处理阵列的怪癖。