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 循环的主要内容,如果未能解决你的问题,请参考以下文章
PHP mysqli_multi_query 在while循环中的事务
PHP mysqli_fetch_array() 不会在 while 循环中将所有选择查询插入到表中