2014-02-10 169 views
1

我在PHP中创建我的while循环时遇到了一些问题。 我希望能够在一个while循环中从多个表中提取数据。例如,我有一张名为“发票”的表格和另一张名为“客户”的表格。两个表都有一个名为Email的字段,并且每当我尝试打印或回显该行时,我只能得到其中的一个。也许你可以看看我的代码。PHP MySQLi虽然循环

<? 
    $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; 
+0

我建议使用ORM,比如Doctirine或Yii的ActiveRecord –

+0

如果你的循环内有'var_dump($ row)',它会显示什么? – dave

+0

这是我得到的(表格,行等从丹麦语翻译成英语之前): 对象(stdClass)#6(22){[“id”] =>字符串(1)“2”[“ kunde_id“] => string(1)”2“[”faktura_aar“] => string(4)”2014“[”faktura_nr“] => string(3)”006“[”dato“] => string(10 )“2014-02-10”[“debitor”] => NULL [“reference”] => NULL [“forsikringsselskab”] => NULL [“attention”] => NULL [“email”] => string(21 )} –

回答

1

您需要别名域,这样就可以seperately引用它们:

<?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注入。

+0

非常感谢!但有一个问题,为什么我应该使用JOIN呢? –

+0

使用JOIN比查看一组WHERE标准更易于阅读。除此之外,如果您使用JOIN(并且正在合并来自两个以上表格的行),则可以控制数据组合在一起的顺序,最后您可以考虑其中某些数据可能不同时存在的情况有关表格。 – kguest

0

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

+0

是的,它可以完美地工作,但它们不是一种让SELECT * FROM这些表而不必输入每个字段的方法吗? –

+0

尝试选择invoices.email作为email1,customers.email作为email2,* ...我不知道它是否有效:P – Iansen

+0

是的,似乎工作正常,但仍然是一个混乱输入每个领域..通过方式,我必须键入SELECT invoices.email作为email1,customers.email作为email2,发票。*,customers。* FROM ... –

0

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

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。然后你可以使用$ result-> column_name。

试试吧。我希望它一定会帮助你。