3

我有一个 PHP 函数,可以从数据库中提取发票的数据。

发票可能不止一行(一种产品)。

function getInvoiceLines($id)
{
   $res = mysql_query("select * from invoice_lines where id = $id ");
   while ($row = mysql_fetch_array($res))
   {
      $res_retun['ref']=$row['ref'];
      $res_retun['label']=$row['label'];
      $res_retun['price']=$row['label'];
      $res_retun['qty']=$row['qty'];
   }

return $res_retun ;

}

我找到了这个链接Create a Multidimensional Array with PHP and MySQL,我使用这个概念制作了这段代码。

现在,如果 MySQL 结果中有更多行,我如何将光标之类的东西移动到下一行并添加更多行?

如果可能的话,我该怎么做才能用 for 显示 HTML 中的数据?

4

4 回答 4

9

稍作修改就可以得到您想要的,在[]运算符下方是向数组添加元素的简写符号,您的代码的问题是您在每次迭代时都覆盖了相同的键

   // fetch only what you need;
   $res = mysql_query("select ref, label, price, qty from invoice_lines where id = $id ");
   while ($row = mysql_fetch_array($res))
   {
      $res_return[] = $row;
   }
   return $res_return;

注意,我修正了你的一些错别字(你使用$rw而不是$row在原始代码的循环中)

于 2012-06-22T01:20:08.780 回答
3

如果您将PDOfetchAll()一起使用,您将返回您期望的数组,也可以避免讨厌:

<?php //Cut down
$db = new PDO("mysql:host=localhost;dbname=dbName", 'root', 'pass');

$sql = "SELECT * FROM invoice_lines WHERE id = :id ";

$stmt = $db->prepare($sql);
$stmt->bindParam(':id', $id);
$stmt->execute();

$res_return = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

然后你只需像任何其他数组一样循环遍历数组:

<?php 
foreach($res_return as $row){
echo $row['ref'];
...
...
}
?>

也不应该有超过 1 行,如果id它是你的主键,它应该是唯一的。

于 2012-06-22T01:28:49.307 回答
2

如果您像使用 PDO 一样使用它,那将非常容易,并且您将解决您的 sql 注入问题

$db = new PDO(...);
function getInvoiceLines( $db,  $id )
{
    $stmnt = $db->prepare("select ref, label, price, qty from invoice_lines where id=?");
    $stmnt->execute( array( $id ) );
    return $stmnt->fetchAll( PDO::FETCH_ASSOC );
}
于 2012-06-22T01:31:55.753 回答
1

首先将变量设为全局然后在函数中访问它。对于经验。

$return_arr = array(); // outside function 
$i = 0;
cal_recursive();  // call function first time

function cal_recursive(){
      global $return_arr;
      global $i;
       $return_arr[$i] = // here push value to array variable
       $i++;

        // do code for recursive function 

return $return_arr // after end
}
于 2017-06-26T08:53:52.313 回答