2012-04-07 12 views
0

ich eine dynamische SQL-Suche habe, die ein Problem mit auf der Meile 'down-Liste Option im mit:PHP MySQL dynamische Suche Problem

<?php 
include('connection.php'); 



if(isset($_POST['Make'])) 
{ 
    $makeSearch = $_POST['Make']; 
    $modelSearch = $_POST['Model']; 
    $colourSearch = $_POST['Colour']; 
    $townSearch = $_POST['Town']; 
    $regionSearch = $_POST['Region']; 
    $regiSearch = $_POST['Reg']; 
    $maxSearch = $_POST['MaxPrice']; 
    $minSearch = $_POST['MinPrice']; 
    $maxMilSearch = $_POST['MaxMil']; 

} 
else 
{ 

    $makeSearch = $_GET['Make']; 
    $modelSearch = $_GET['Model']; 
    $colourSearch = $_GET['Colour']; 
    $townSearch = $_GET['Town']; 
    $regionSearch = $_GET['Region']; 
    $regiSearch = $_GET['Reg']; 
    $maxSearch = $_GET['MaxPrice']; 
    $minSearch = $_GET['MinPrice']; 
    $maxMilSearch = $_GET['MaxMil']; 


} 




if(!isset($_GET['pageNo'])) 
{ 
    $pageNo = 0; 
} 


else 
{ 
    $pageNo = $_GET['pageNo']; 
} 

$noOfRecords = 4; 
$startRecord = $pageNo * $noOfRecords; 
$nextPage = $pageNo + 1; 
$prevPage = $pageNo - 1; 
$curpage = $pageNo + 1; 




     $sql2 = "SELECT * FROM cars WHERE 1=1"; 
    if($makeSearch !== "Select Make") 
    { 
     $sql2 .= " AND make = '$makeSearch'"; 
    } 
    ..................... 
    if($maxMilSearch !== "Select Max Mileage") 
    { 
     $sql2 .= " AND miles <= '$maxMilSearch'"; 
    } 

















     $sql = "SELECT * FROM cars WHERE 1=1"; 
    if($makeSearch !== "Select Make") 
    { 
     $sql .= " AND make = '$makeSearch'"; 
    } 
    ......................... 
    { 
     $sql .= " AND miles <= '$maxMilSearch'"; 
    } 

    $sql .= "LIMIT $startRecord, $noOfRecords"; 


    $result2 = mysql_query($sql2,$odbc) or die ("Can't run query1"); 
    $result = mysql_query($sql,$odbc) or die ("Can't run query2"); 

    echo"$sql"; 

    $num_rows = mysql_num_rows($result2); 


echo"$num_rows"; 

$last = ceil($num_rows/$noOfRecords); 


if(mysql_num_rows($result) == 0) 
{ 
    echo "No cars found"; 

} 



else 

{ 
    echo "<table border = 1>"; 
    while($row=mysql_fetch_object($result)) 
    { 
     echo "<tr>"; 
      echo"<td>"; 
       echo$row->make; 
      echo"</td>"; 
      echo"<td>"; 
       echo$row->model; 
      echo"</td>"; 
      echo"<td>"; 
       echo$row->Reg; 
      echo"</td>"; 
      echo"<td>"; 
       echo$row->colour; 
      echo"</td>"; 
      echo"<td>"; 
       echo$row->miles; 
      echo"</td>"; 
      echo"<td>"; 
       echo$row->price; 
      echo"</td>"; 
      echo"<td>"; 
       echo$row->dealer; 
      echo"</td>"; 
      echo"<td>"; 
       echo$row->telephone; 
      echo"</td>"; 
      echo"<td>"; 
       echo$row->description; 
      echo"</td>"; 
      echo"<td>"; 
       echo$row->carIndex; 
      echo"</td>"; 
      echo"<td>"; 
       echo$row->region; 
      echo"</td>"; 
      echo"<td>"; 
       echo$row->town; 
      echo"</td>"; 
      echo"<td><a href='look.php?carIndex=$row->carIndex&Reg=$row->Reg&make=$row->make&model=$row->model&colour=$row->colour&price=$row->price&miles=$row->miles&dealer=$row->dealer&telephone=$row->telephone&description=$row->description&region=$row->region'>More Info</a></td>"; 





    echo"</tr>"; 
    } 
    echo "<tr>"; 
echo"$curpage"; 
echo"$last"; 
if($pageNo >= 1) 
{ 

     echo "<td><a href='search.php?pageNo=$prevPage&Make=$makeSearch&Model=$modelSearch&Reg=$regiSearch&MaxMil=$maxMilSearch&Colour=$colourSearch&Town=$townSearch&Region=$regionSearch&MaxPrice=$maxSearch&MinPrice=$minSearch'>Previous</a></td>"; 
} 

if($pageNo < $last - 1) 
{ 
     echo "<td><a href='search.php?pageNo=$nextPage&Make=$makeSearch&Model=$modelSearch&Reg=$regiSearch&MaxMil=$maxMilSearch&Colour=$colourSearch&Town=$townSearch&Region=$regionSearch&MaxPrice=$maxSearch&MinPrice=$minSearch'>Next</a></td>"; 
}  
    echo"</tr>"; 
    echo"</table>"; 


} 

>

Das Problem, das ich habe, ist die 'Mileage' Input ist soweit ich sehen kann, ignoriert. Wenn ich (zB aus meiner Drop-Down-Liste) beispielsweise 5000 Meilen eingebe, um alle darunter liegenden Autos zurückzuliefern und gleich diesem, dann werden die zufälligen Ergebnisse mit jedem Kilometer zurückgegeben. Was ich sagen werde ist, dass, wenn ich zum Beispiel ein Auto wähle, dann einen Kilometerstand auswählen, wird es das korrekte Ergebnis zurückgeben.

Wirklich nicht sicher, was ich hier falsch mache, da alle meine anderen Optionen richtig funktionieren.

Jede Hilfe wäre großartig!

+0

echo die letzte Abfrage und post –

+0

Hallo, meinst du echo: $ result = mysql_query ($ sql, $ odbc) oder sterben ("Kann query2 nicht ausführen"); d. h. was ist '$ result'? – Touy

+0

Er bedeutet 'echo $ sql;' – Lix

Antwort

3

Wenn Sie die endgültige Abfrage abfragen, erhalten Sie einen Hinweis, wenn alles in Ordnung ist. Wenn Sie PHPMYADMIN ausführen, erhalten Sie ebenfalls einen guten Hinweis darauf, dass Ihre Abfrage gültig ist und die richtigen Ergebnisse liefert.

Diese etwas andere Methode zum Zusammenstellen der Abfrage könnte Ihnen helfen. Es macht auch IMO ein wenig leichter zu lesen.

$sql = "SELECT * FROM cars WHERE "; 
$whereClause = array(); 

if($makeSearch !== "Select Make"){ 
    $whereClause[] = "make = '$makeSearch'"; 
} 

... 

if($maxMilSearch !== "Select Max Mileage"){ 
    $whereClause[] = "miles <= '$maxMilSearch'"; 
} 

$sql .= implode(" AND ",$whereClause) . "LIMIT $startRecord, $noOfRecords"; 

echo $sql; 
exit(); 

Das sollte die endgültige Abfrage auf dem Bildschirm und thex Exit drucken.

Ich verwende die Kurzversion von array_push(), um Elemente zum $whereClause Array hinzuzufügen - $whereClause[] = VALUE. Die [] ist wie eine Push-Aktion; Hinzufügen eines zusätzlichen Elements zum Ende des Arrays.

Die andere nützliche Funktion, die ich verwendet habe, ist die implode() Funktion. Diese Methode verwendet ein Array und fügt es zu einer Zeichenfolge zusammen, wobei die angegebene Zeichenfolge verwendet wird, um sie zu verbinden. Es ist wirklich nützlich beim Zusammenstellen von Abfragen, wie Sie es hier tun.

Neben es für die where-Klausel zu verwenden Sie es für eine Liste von Werten verwenden könnte -

$cowDetails = array(
'1', 
'"Cow"', 
'"Moo"' 
); 
$insertSql = "INSERT INTO `zoo` ('id','name','sound') 
       VALUES (".implode(',',$cowDetails).")"; 

echo $insertSql; 
exit(); 

Ausgang:
INSERT INTO Zoo ('id','name','sound') VALUES (1,"Cow","Moo")

Sobald Sie überprüft haben, dass die Abfrage korrekt ist, können Sie dieentfernenund die exit() Befehle.

+0

Danke Lix, Heres meine SQL-Ausgabe SELECT * FROM Autos WHERE 1 = 1 AND miles <= '2000' Ich habe einfach einen zufälligen '2000' Wert gewählt. Ich habe auch ein anderes Skript für die Paginierung (das genau das selbe ist, das mir den sql von SELECT * FROM Autos gab WO 1 = 1 AND miles <= '2000' LIMIT 0 – Touy

+0

Sie sollten das zu Ihrem ursprünglichen Beitrag hinzufügen und diesen Kommentar löschen:) Hat meine Antwort Ihnen geholfen? – Lix

+0

Nur zum Hinzufügen habe ich diese Abfrage in phpmyadmin SELECT * FROM Autos WHERE 1 = 1 AND miles <= 2000 ausgeführt und es funktioniert gut, so ist das Problem definitiv in meinem Skript. Ich habe nur keine Ahnung wo! – Touy