PHP MySQLi While 循环

Posted

技术标签:

【中文标题】PHP MySQLi While 循环【英文标题】:PHP MySQLi While Loop 【发布时间】:2014-02-10 20:49:57 【问题描述】:

php 中创建我的 while 循环时遇到了一些问题。 我希望能够在 while 循环内从多个表中提取数据。例如,我有一个名为 Invoices 的表和另一个名为 Customers 的表。两个表都有一个名为 Email 的字段,每当我尝试打印或回显该行时,我只会得到其中一个。也许你可以看看我的代码。

    <?
    $invoice_edit_query = $db->query("SELECT * FROM invoices, customers 
    WHERE invoice.customer_id = kunder.id AND
    invoices.kunde_id = '$_GET[edit]' AND
    invoices.invoice_year = '$_GET[year]' AND
    invoices.invoice_nr = '$_GET[nr]'") or die(mysqli_error($db));

    while($row = $invoice_edit_query->fetch_object())
        ?>
        <td>Email: <input type="text" name="email" value="<? print $row->email; ?>"></td>
        <?
    
    ?>

有没有办法打印我的表格的值,例如 WHERE 声明 invoices.email 或 customers.email?也许不是写:

    $row->email;

然后写:

    $row->invoices.email;

【问题讨论】:

我建议使用 ORM,例如 Doctirine 或 Yii 的 ActiveRecord 如果你在循环中var_dump($row) 会显示什么? 这就是我得到的(表格、行等之前已从丹麦语翻译成英语):object(stdClass)#6 (22) ["id"]=> string(1) “2”[“kunde_id”]=>字符串(1)“2”[“faktura_aar”]=>字符串(4)“2014”[“faktura_nr”]=>字符串(3)“006”[“dato”] => string(10) "2014-02-10" ["debitor"]=> NULL ["reference"]=> NULL ["forsikringsselskab"]=> NULL ["attention"]=> NULL ["email"] => 字符串(21) 很抱歉指出这一点,但是您在查询中使用了未经处理的 $_GET 数据,这使您面临 SQL 注入的风险:ie1.php.net/manual/en/mysqli.real-escape-string.php 我有清理我所有数据的功能 :) 【参考方案1】:

您需要为字段设置别名,以便可以单独引用它们:

<?php
$id = (int) $_GET['edit'];
$year = (int) $_GET['year'];
$nr = (int) $_GET['nr'];

$sql = "SELECT customer.email as customer_email, invoices.email as invoices_email, * FROM invoices  
JOIN customers on  customer.customer_id = invoices.id 
WHERE 
invoices.kunde_id = '$id' AND
invoices.invoice_year = '$year' AND
invoices.invoice_nr = '$nr'";
$invoice_edit_query = $db->query($sql);
while($row = $invoice_edit_query->fetch_object())
    ?>
    <td>Email: <input type="text" name="email" value="<? print $row->customer_email; ?>"></td>
    <?

?>

请注意,我还添加了一些基本测试来防止 SQL 注入。

【讨论】:

非常感谢!但是有一个问题,为什么我应该使用 JOIN 来代替? 使用 JOIN 比查看一组 WHERE 标准更容易阅读。除此之外,如果您使用 JOIN(并且正在组合来自超过 2 个表的行),您可以控制数据组合在一起的顺序,最后您可以允许某些数据可能不存在于两个表中的情况相关表格。【参考方案2】:

试试“SELECT invoices.email as email1, customers.email as email2, other fields FROM”...然后打印出来。

【讨论】:

是的,效果很好,但它们不是一种从这些表中选择 * 而不必输入每个字段的方法吗? 尝试选择 invoices.email 作为 email1,customers.email 作为 email2,* ...我不知道它是否有效:P 是的,似乎工作正常,但在每个字段中输入仍然很乱。顺便说一句,我必须输入 SELECT invoices.email 作为 email1,customers.email 作为 email2,发票。 *,客户。* FROM...【参考方案3】:

嘿,我在我的项目中做了同样的事情。

protected function _dynamicBindResult($stmt)

    $parameter = array();
    $result = array();

    //get list of all columns in Parameter array
    $count = $stmt->columnCount();
    for ($i = 0; $i < $count; $i++) 
        $temp = $stmt->getColumnMeta($i);
        $parameter[] = $temp['name'];
    

    //now filter row on basis of parameter array
    while ($row = $stmt->fetch()) 
        $x = array();

        foreach ($parameter as $key => $column) 
            $x[$column] = $row[$column];
        
        $result[] = $x;
    

    return $result;

在您的项目中调用此函数 _dynamicBindResult 并将 $row 作为参数传递。然后你可以使用 $result->column_name。

试试看。希望对你有帮助。

【讨论】:

【参考方案4】:

您可以使用 MySQL 的“DESCRIBE”功能来获取所有字段名称。

https://dev.mysql.com/doc/refman/5.0/en/getting-information.html

您可以“描述”一个表格,它会为您提供“字段”列中的每个字段。循环遍历每个字段并将其添加到您的查询中。

【讨论】:

以上是关于PHP MySQLi While 循环的主要内容,如果未能解决你的问题,请参考以下文章

使用 while 循环回显 PHP 数组

PHP mysqli_multi_query 在while循环中的事务

PHP mysqli_fetch_array() 不会在 while 循环中将所有选择查询插入到表中

php mysqli在嵌套循环中准备语句抛出命令或同步错误[重复]

如何在 mysqli 查询中使用 while 循环

while循环里面循环得到子子类