簡體   English   中英

從PHP中的WHERE子句獲取多個結果

[英]Getting multiple results from WHERE clause in PHP

請原諒我可怕的編碼和設計方面。 我並不太關心它的外觀,因為我的工作效果如何。

我有2個表(汽車,客戶),其中兩個都有VIN列。 當我添加一輛新車時,我放入了VIN,當客戶購買車輛時,我從所有車輛中填充的下拉列表中選擇VIN,並將字段VSold設置為“N”。 這很好用,我的問題是,當我運行下面的代碼時,它給了我多個客戶名稱。 當我在該數據庫中為該表和精確的VIN運行搜索查詢時,只有一個客戶具有匹配的VIN(我使其成為獨一無二的),但在我丑陋的代碼中,它給了我一堆結果,都是一樣的汽車,只是不同的客戶。 我在這做錯了什么? 我怎樣才能清理這個東西?

<?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(VSold ='N')時,我沒有任何問題。 (我想......)我嘗試在桌子之間使用UNION,但我更加混亂了。

提前謝謝你的幫助!

更新:

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

是我在頁面上添加客戶的內容。 它將所有客戶信息(CustFirst,CustLast等)輸入到客戶表中。 因此,如果沒有客戶與任何VIN(Cars.VIN)相關聯,則不會填寫Customers.VIN。

如果我正確理解了您的問題(您有多個查詢返回而不僅僅是一個),請更改此:

WHERE Cars.VIN='$VIN'

對此

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

從你想要做的事情來看,你應該使用內部來從兩個表中獲取信息。

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'";
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'

carscustomers之間生產笛卡爾積 也就是說,它返回兩個表之間的所有行組合。 為避免這種情況,您需要加入。 如果每個客戶總是至少有一輛售出的汽車(即,它是銷售數據庫),那么使用inner join 但是,如果您的客戶有時沒有購買汽車,但仍然想要所有客戶,那么請使用left join 如果沒有相應的記錄,這將導致所有car列包含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注入

雖然您的所有答案都解決了多個搜索結果,但如果車輛未售出則沒有給我任何結果,因此沒有與任何客戶相關的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>";
                }
}
}

就像我說的那樣,可能不是最有效的方法,但效果很好。 感謝大家!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM