2014-02-10 5 views
1

У меня возникают некоторые проблемы при создании цикла while в PHP. Я хочу, чтобы вытащить данные из нескольких таблиц в цикле while. Например, у меня есть таблица Invoices и вторая таблица Customer. В обеих таблицах есть поле с именем «Электронная почта», и всякий раз, когда я пытаюсь напечатать или повторить эту строку, я получаю только один из них. Возможно, вы могли бы взглянуть на мой код.PHP MySQLi While Loop

<? 
    $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 или Yri ActiveRecord –

+0

, что он показывает, если вы 'var_dump ($ row)' внутри цикла? – dave

+0

Это то, что я получаю (таблицы, строки и т. Д. Были переведены с датского на английский раньше): объект (stdClass) # 6 (22) {["id"] => string (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 ["внимание"] => NULL ["email"] => string (21)} –

ответ

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.

+0

Большое спасибо! Один вопрос, почему я должен использовать JOIN вместо этого? –

+0

Использование JOIN легче читать, чем смотреть на набор критериев WHERE.Кроме того, если вы используете JOIN (и объединяете строки из более чем двух таблиц), вы можете управлять порядком, в котором данные объединяются вместе, и, наконец, вы можете разрешить сценарии, когда некоторые из данных могут отсутствовать в обоих соответствующих таблиц. – kguest

0

Try "SELECT invoices.email as email1, customers.email as email2, other fields FROM" ..., а затем распечатать те из.

+0

Да, что работает отлично, но не является ли их способом SELECT * Из этих таблиц вместо того, чтобы вводить каждое отдельное поле? –

+0

Попробуйте SELECT invoices.email как email1, customers.email как email2, * ... Я не знаю, работает ли это: P – Iansen

+0

Да, кажется, все работает нормально, но все равно беспорядок набирать в каждом поле. путь, я должен был набрать SELECT invoices.email как email1, customers.email как email2, invoices. *, клиенты. * 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.

Попробуйте. Надеюсь, это поможет вам.

0

Функцию MySQL DESCRIBE можно использовать для получения всех имен полей.

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

Вы можете «DESCRIBE» таблицу, и это даст вам каждое из полей в столбце «поле». Прокрутите каждое поле и добавьте его в свой запрос.