2014-01-20 4 views
0

Я поставил сценарий вместе, который печатает все строки из таблицы «sales_list», но только тех, кто с «users_sales_guild_id», который соответствует вошедшего в систему пользователя. Это прекрасно работает.Выберите запрос соединения двух таблиц PHP

То, что я пытаюсь сделать, это распечатать все строки, но получит соответствующие sales_id из «accessories_orders» стола и поставить «accessories_orders_total» и отгружен статус с запросом, поэтому запрос ниже должно выглядеть так, как показано в браузере, если у входа пользователя есть «user_sales_guild_id» значение «1234».

+--------+---------------+-------------------+----------+ 
| Model | Customer Name | Accessories Total | Status | 
+--------+---------------+-------------------+----------+ 
| Nissan | Malcom Smith |     | Add  | 
| Ford | Jane Smith | 200.00   | Pending | 
+------------------------+-------------------+----------+ 

Так что, если есть соответствующая строка в «accessories_orders» стола, то он будет печатать «погруженный» и данные «accessories_orders_total» в . Если для этого нет подходящей строки, тогда отобразится ссылка «Добавить», которая приведет к add_accessories_sales.php.

У меня появляется сообщение об ошибке «Undefined index: sales_model» и почти все остальное в рамках первого запроса, может ли кто-нибудь указать, где я ошибаюсь?

Таблица "sales_list"

+--------------------------------------------------------------------------------------------------------------------------+ 
| sales_list                            | 
+------+--------------------------+--------------------------+------------------------+-------------+----------------------+ 
| sales_id | users_sales_guild_id | sales_customer_firstname | sales_customer_surname | sales_model | sales_entry_date | 
+----------+----------------------+--------------------------+------------------------+-------------+----------------------+ 
| 1  | 1234     | Jane      | Smith     | Ford  | 2013-12-02 12:00:00 | 
| 2  | 5678     | John      | Chan     | Mazda  | 2013-12-03 12:00:00 | 
| 3  | 5678     | Kevin     | Chan     | Fiat  | 2013-12-04 12:00:00 | 
| 4  | 1234     | Malcom     | Smith     | Nissan  | 2013-12-05 12:00:00 | 
+----------+----------------------+--------------------------+------------------------+-------------+----------------------+ 

"accessories_orders" стол

+-------------------------------------------------------------------------------------------------------------------------+ 
| accessories_orders                          | 
+-----------------------+----------------------+----------+--------------------------+-------------------------+----------+ 
| accessories_orders_id | users_sales_guild_id | sales_id | accessories_orders_total | accessories_orders_date | shipped | 
+-----------------------+----------------------+----------+--------------------------+-------------------------+----------+ 
| 1      | 1234     | 1  | 200.00     | 2013-12-02 12:00:00  | Pending | 
| 2      | 5678     | 2  | 350.00     | 2013-12-03 12:00:00  | Pending | 
| 3      | 5678     | 3  | 100.00     | 2013-12-03 12:00:00  | Pending | 
+-----------------------+----------------------+----------+--------------------------+-------------------------+----------+ 

отредактирован и ОБНОВЛЕНО Код

<?php 
require_once ('database.php'); // Connect to the database. 

$query = " SELECT sl.sales_model, sl.sales_customer_firstname, sl.sales_customer_surname, ao.accessories_orders_total, ao.shipped, 
     COALESCE(ao.shipped) 
     FROM sales_list sl 
     LEFT JOIN accessories_orders ao ON(ao.sales_id = sl.sales_id) 
     WHERE sl.users_sales_guild_id ='".$_SESSION['users_sales_guild_id']."' 
     ORDER BY 
    ".$order_by." LIMIT ".$start.", ".$display; 

$result = @mysql_query ($query); // Run the query. 

echo '<table width="610" cellspacing="1" cellpadding="5" style="font-size:11px;"> 
<tr> 
<td align="center">Model </td> 
<td align="center">Customer Name</td> 
<td align="center">Accessories Total</td> 
<td align="center">Status</td></tr>'; 

$bg = '#ffffff'; // Set the background color. 
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { 

$status = $row['shipped']; 

$bg = ($bg=='#e1e3e6' ? '#cdcdcf' : '#e1e3e6'); // Switch the background color. 
echo '<tr bgcolor="' . $bg . '">'; 
echo '<td align="center">' . $row['sl.sales_model'] . '</td>'; 
echo '<td align="center">' . $row['sl.sales_customer_firstname'] . ' ' . $row['sl.sales_customer_surname'] . '</td>'; 
echo '<td align="center">$' . $row['acc.accessories_orders_total'] . '</td>'; 

$str = '<td align="center">'; 
if($status == 'Pending') { 
$str .=' Pending</td></tr>'; 
} 
else { 
$str .='<strong><a href="add_accessories_sales.php?sid=' . $row['sl.sales_id'] . '">Add</a></strong></td></tr>'; 
} 
echo $str; 
} 

echo '</table>'; 
mysql_free_result ($result); // Free up the resources. 
mysql_close(); //Close the database connection. 
?> 
+0

'mysql' устарел. использовать 'mysqli' – hammus

+0

Не работает – AdamMc

+0

, вы хотите использовать JOIN – serakfalcon

ответ

1

Ваш запрос должен быть больше, как это:

SELECT sl.sales_model, sl.sales_customer_firstname, sl.sales_customer_surname, ao.accessories_orders_total, COALESCE(ao.shipped, 'Add') status 
FROM sales_list sl 
LEFT JOIN accessories_orders ao ON(ao.sales_id = sl.sales_id) 
WHERE sl.users_sales_guild_id = 1234; 

LEFT JOIN является ключевым здесь. Он позволяет возвращать строку с данными от sales_list, даже если в accessories_orders нет соответствующей записи.

Смотрите эту скрипку рабочий пример: http://sqlfiddle.com/#!2/f7d3d/4

Как и другие уже говорили, вы должны использовать функцию mysqli набора, в отличие от множества mysql функции.

+0

Это работало так, что оно вернуло правильные аксессуары_orders_total в правильной строке, которая была отправлена, однако кнопка Add/Pending не работает, так как она просто добавляет «Добавить», я буду играть с ней и представить код когда завершено. Спасибо за вашу помощь @Starson Hochschild, и спасибо за эту ссылку тоже, это отличный сайт! – AdamMc

+0

Я обновил код, который работает. Благодаря @Starson Hochschild – AdamMc

0

Во-первых, вы не должны включать имена таблиц. Пример:

//wrong 
echo '<td align="center">' . $row['sl.sales_model'] . '</td>'; 

//correct 
echo '<td align="center">' . $row['sales_model'] . '</td>'; 

Во-вторых, вы не должны использовать mysql, если вы не используете устаревшую версию PHP. Переключить на: mysqli или PDO.

В-третьих, у вас нет обработки ошибок, чтобы сообщить, успешно ли ваш запрос или нет. Фактически, у вас есть противоположность обработке ошибок, потому что вы пытаетесь использовать оператор @ для подавления ваших ошибок. Вместо этого, вы должны сделать что-то вроде этого:

//assuming you switch to mysqli 
mysqli_query("SELECT acc.accessories_orders_id, acc.users_id, acc.sales_id, 
     acc.accessories_orders_total, acc.accessories_orders_date, acc.shipped, 
     acc.timestamp, sl.sales_id 
     FROM accessories_orders AS acc, sales_list AS sl 
     WHERE acc.sales_id = sl.sales_id"); 
if(mysqli_error()) { 
    throw new Exception(mysqli_error(), mysqli_errno()); 
} 

Если вы это сделаете, ваши ошибки MySQL будут записываться в том же месте, что и ваши ошибки PHP. Затем вы сможете узнать, не вызвана ли какая-либо из ваших проблем неправильной формой запроса.

+0

Спасибо за отзыв @spsc_tech – AdamMc

+0

Я обновил код, он отлично работает, даже с функцией mysql. Я скоро обновлю, спасибо за вашу помощь. – AdamMc

+0

Расширение Mysql работает до тех пор, пока оно не прекратит выпуск соединений с базой данных (несмотря на многочисленные вызовы close() и отключение постоянных подключений) и приводит к сбою вашего сервера. Говоря от действительно, действительно раздражающего опыта. – miyasudokoro

Смежные вопросы