2016-07-09 1 views
1

Прошу прощения за мой ужасный аспект кодирования и дизайна. Я не слишком беспокоюсь о его внешнем виде, поскольку я знаю, как хорошо он работает.Получение нескольких результатов из предложения WHERE в PHP

У меня есть 2 стола (автомобили, клиенты), в которых оба имеют колонки VIN. Когда я добавляю новый автомобиль, я ставлю VIN, и когда клиент покупает автомобиль, я выбираю VIN из раскрывающегося списка, который заполняется во всех автомобилях, с полем VSold устанавливается значение «N». Это отлично работает, проблема заключается в том, что когда я запускаю код ниже, он дает мне несколько имен клиентов. Когда я запускаю поисковый запрос в этой базе данных для этой таблицы и точный VIN, есть только один клиент, у которого есть соответствующий VIN (я сделал его UNIQUE), но в моем уродливом коде он дает мне кучу результатов, все равно автомобиль, просто разные клиенты. Что я здесь делаю неправильно? Как я могу это очистить?

<?php 
$dbhost = 'localhost'; 
$dbuser = 'root'; 
$dbpass = ''; 

$conn = mysql_connect($dbhost, $dbuser, $dbpass); 

if(! $conn) { 
    die('Could not connect: ' . mysql_error()); 
} 

$VIN=$_POST['formVIN']; 

$sql = 
    "SELECT 
    Cars.VIN, Cars.VYear, Cars.VMake, Cars.VModel, 
    Cars.VOdometer, Cars.VPurchasedPrice, Cars.VPurchasedDate, 
    Cars.VSold, Cars.VSoldPrice, Cars.VSoldDate, Cars.VSalesPerson, 
    Customers.CustFirst, Customers.CustLast 
    FROM 
    Cars, Customers 
    WHERE Cars.VIN='$VIN'"; 

mysql_select_db('dbCar2016'); 
$retval = mysql_query($sql, $conn); 

if(! $retval) { 
die('Could not get data: ' . mysql_error()); 
} 
    while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) { 
    echo "Information on record for the VIN provided:<br><br>"; 
    echo "VIN:" . $row["VIN"] . "<br>"; 
    echo "Year:" . $row["VYear"] . "<br>"; 
    echo "Make:" . $row["VMake"] . "<br>"; 
    echo "Model:" . $row["VModel"] . "<br>"; 
    echo "Odometer:" . $row["VOdometer"] . "<br>"; 
    echo "Purchased Price:$" . $row["VPurchasedPrice"] . "<br>"; 
    echo "Purchased Date:" . $row["VPurchasedDate"] . "<br><br>"; 
     if ($row["VSold"]=='Y') { 
     echo "This Vehicle sold.<br>"; 
     echo "Price Sold:" . $row["VSoldPrice"] . "<br>"; 
     echo "Date Sold:" . $row["VSoldDate"] . "<br>"; 
     echo "Sales Person:" . $row["VSalesPerson"] . "<br><br>"; 

     echo "It was sold to<br>"; 
     echo "Customer Name:" . $row["CustFirst"] . " " . $row["CustLast"] . "<br>"; 
    } else { 
     echo "This Vehicle has not sold yet.<br>"; 
    } 
    echo "<p>VIN Successfully Searched</p>"; 
} 
echo "<a href=vinlookup.php>Search Another VIN</a>"; 
mysql_close($conn); 
?> 

Когда я положил VIN в виде vehichle не проданное (VSold = 'N'), у меня нет какого-либо вопроса. (Я думаю ...) Я попытался использовать СОЮЗ между таблицами, но меня еще больше перепутало.

Заранее благодарим за помощь!

UPDATE:

UPDATE 
    Cars SET VSold='Y', 
    VSoldPrice='$VSoldPrice', 
    VSoldDate='$CustDownDate', 
    VSalesPerson='$VSalesPerson' 
WHERE 
    VIN='$VIN' 

Это то, что у меня есть на странице, что я добавить клиентов в. Он вносит всю информацию о клиентах (CustFirst, CustLast и т. Д.) В таблицу Customers. Таким образом, никакие клиенты.VIN никогда не будут заполнены, если не было клиента, связанного с любым VIN (Cars.VIN).

+2

Я впечатлен тем, что есть люди, которые используют библиотеку mysql_ * без проверок впрыска. 'ВЫБРАТЬ с. *, b.CustFirst, b.CustLast ОТ Автомобили с LEFT JOIN Клиенты б ON c.VIN = b.VIN WHERE c.VIN = $ VIN' или просто JOIN в зависимости от того, хотите ли у для включения результатов без покупателей или всего. – Prix

+0

@Prix, то вы будете впечатлены большим количеством пользователей StackOverflow ;-) – Martin

+0

Cesar - MySQL теперь DEPRECATED и больше не поддерживается PHP7, вы должны с крайним предубеждением прекратить его использовать и вместо этого изучить MySQLi или PDO. Ваш код также развивался бы в прыжках и ограничениях, если бы вы исследовали и начали внедрять подготовленные заявления, а не текущую «аналоговую» реализацию SQL-запросов с PHP – Martin

ответ

0

Несмотря на то, что все ваши ответы разрешали множественные результаты поиска, это не давало мне никаких результатов, если автомобиль не был продан, следовательно, VIN не был связан с каким-либо клиентом. Я решил это сделать с помощью нескольких поисковых запросов и инструкций IF. ВЕРОЯТНО не самая эффективная или чистоплотная, но она отлично работает. Любые улучшения кода всегда приветствуются. Спасибо за помощь всем своим парням!

$formVIN = $_POST[formVIN] 

sql1= SELECT * FROM Cars WHERE VIN=$formVIN 
sql2= SELECT * FROM Customers WHERE VIN=$formVIN 

$retval1=mysql_query($sql1, $conn) 
$retval2=mysql_query($sql2, $conn) 

if(! $retval1) { 
    die('No VIN information.' . mysql_error()); 
} else { 

    while($row1 = mysql_fetch_array($retval1, MYSQL_ASSOC)) { 
    echo "<p><b>Information on record for the VIN provided:</b></p>"; 
    echo "VIN:" . $row1["VIN"] . "<br>"; 
    echo "Year:" . $row1["VYear"] . "<br>"; 
    echo "Make:" . $row1["VMake"] . "<br>"; 
    echo "Model:" . $row1["VModel"] . "<br>"; 
     if ($row1["VSold"]=='Y') 
     { 
      while($row2 = mysql_fetch_array($retval2, MYSQL_ASSOC)) { 
      echo "<p><b>This Vehicle sold.</b></p>"; 
      echo "Price Sold:" . $row1["VSoldPrice"] . "<br>"; 
      echo "Date Sold:" . $row1["VSoldDate"] . "<br>"; 
      echo "Sales Person:" . $row1["VSalesPerson"] . "<br>"; 

      echo "<p><b>It was sold to:</b></p>"; 
      echo "Customer ID:" . $row2["CustID"] . "<br>"; 
      echo "Customer Name:" . $row2["CustFirst"] . " " . $rowl["CustLast"] . "<br>"; 
      } 
     } else 
       { 
        echo "<p><b>This Vehicle has not sold yet.</b></p><br>"; 
       } 
} 
} 

Как я уже сказал, вероятно, не самый эффективный способ обойти это, но он отлично работает. Всем спасибо!

0

Если я правильно понял вашу проблему (у вас есть несколько запросов, возвращающих и не только один), изменить:

WHERE Cars.VIN='$VIN'

к этому

WHERE Cars.VIN='$VIN' AND Cars.VIN = Customers.VIN

+0

Теперь это работает, когда VSold имеет значение Y, но не тогда, когда оно установлено на N. Weird ... –

+0

Поскольку нет Client.VIN, если VSold имеет значение N, это не даст мне результата. –

+0

Но вы написали: «У меня есть 2 таблицы (Cars, Customers), в которых оба имеют поле VIN». Так ты лжешь? – matiaslauriti

0

Из того, что он выглядит вы пытаетесь сделать это, вы должны использовать внутреннее, чтобы получать информацию из обеих таблиц.

SELECT Cars.VIN, Cars.VYear, Cars.VMake, Cars.VModel, Cars.VOdometer, Cars.VPurchasedPrice, Cars.VPurchasedDate, Cars.VSold, Cars.VSoldPrice, Cars.VSoldDate, Cars.VSalesPerson, Customers.CustFirst, Customers.CustLast 
FROM Cars 
INNER JOIN Customers 
ON Customers.vin = Cars.vin 
WHERE Cars.VIN='$VIN'"; 
+0

Устанавливает несколько записей, отображаемых, когда VSold установлен на« Y », но пока VSold установлен на« N »в таблице Cars, в таблице Customers не будет установлен VIN. Таким образом, клиенты.VIN будут нулевыми и никогда не будут равны Cars.VIN. –

0
SELECT 
    Cars.VIN, Cars.VYear, Cars.VMake, Cars.VModel, Cars.VOdometer, 
    Cars.VPurchasedPrice, Cars.VPurchasedDate, Cars.VSold, Cars.VSoldPrice, 
    Cars.VSoldDate, Cars.VSalesPerson, Customers.CustFirst, Customers.CustLast 
FROM 
    Cars, Customers 
WHERE 
    Cars.VIN='$VIN' 

Производит cartesian product между cars и customers. То есть, он возвращает все комбинации строк между двумя таблицами. Чтобы этого избежать, вам нужно присоединиться. Если у вас всегда будет по крайней мере один проданный автомобиль на одного клиента (т. Е. База данных продаж), используйте inner join. Если, однако, иногда у вас могут быть клиенты, которые не купили автомобиль, но все равно хотят всех клиентов, а затем используйте left join. Это приведет к тому, что все столбцы автомобилей будут содержать NULL, если нет соответствующей записи.

SELECT 
    Cars.VIN, Cars.VYear, Cars.VMake, Cars.VModel, Cars.VOdometer, 
    Cars.VPurchasedPrice, Cars.VPurchasedDate, Cars.VSold, Cars.VSoldPrice, 
    Cars.VSoldDate, Cars.VSalesPerson, Customers.CustFirst, Customers.CustLast 
FROM 
    Cars 
    LEFT JOIN Customers on Cars.VIN = Customers.VIN 
WHERE 
    Cars.VIN='$VIN' 

Кроме того, обратите внимание на использование Mysqli библиотеки (или аналогичного) и узнать, как параметризация ваших запросов, чтобы вы могли избежать иметь дело с SQL Injection позже.

+0

Пока для параметра «Автомобили.VSold» установлено значение «N», клиент не будет связывать его с (Customer.VIN). Таким образом, он отлично работает для автомобилей, которые были проданы, но ничего не тянет, когда я смотрю на Car.VIN, которого нет, поэтому предложение Cars.VIN = Customers.VIN никогда не даст мне результата. –

+0

@CesarCervantes Эта ссылка может помочь вам понять: http://www.sql-join.com/ – Martin

+0

Вместо этого используйте 'left join'. – sagi

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