2016-07-22 16 views
-1

Ich musste schnelle PDO-Abfrage erstellen (das ist sehr alte Website, Framework ist nicht möglich), und ich habe ein Problem, wenn ich mehr als einen Parameter für die Suche eingeben.PHP PDO Abfrage SQLSTATE [42000] Fehler

(für den einzelnen Parameter funktioniert es gut, aber die Kombination von zwei oder mehr Parametern wird SQLSTATE [42000] Fehler geben).

komplette Fehler:

<br /> 
<b>Fatal error</b>: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or 
access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your 
MySQL server version for the right syntax to use near 'WHERE CUSTPHON.PHONE = '1230001343' 
     GROUP BY CUSTOMER.CUST_ID 
     ORDER BY CUST' at line 7' in /home/larrysii/public_html/yaclib/lib/db.php:104 

Linie 104 in db ist für QUERY:

public function execute(){ 
     return $this->stmt->execute(); 
    } 

Was ist hier falsch?

Ich erhalte Daten aus dem Formular wie folgt aus (ich weiß nicht, welche param verwendet wird):

$searchParams = []; 

    if(strlen($_POST['customerName']) > 2) 
     $searchParams['customerName'] = strtolower(strip_tags(trim($_POST['customerName']))); 

    if(strlen($_POST['cardNumber']) == 7) 
     $searchParams['cardNumber'] = strtolower(strip_tags(trim($_POST['cardNumber']))); 

    if(strlen($_POST['phoneNumber']) > 3) 
     $searchParams['cardNumber'] = strtolower(strip_tags(trim($_POST['phoneNumber']))); 

    if(strlen($_POST['customerAddress']) > 3) 
     $searchParams['customerAddress'] = strtolower(strip_tags(trim($_POST['customerAddress']))); 

    if(strlen($_POST['customerEmail']) > 2) 
     $searchParams['customerEmail'] = strtolower(strip_tags(trim($_POST['customerEmail']))); 

Und das ist, wie ich Abfrage machen:

$queryArray = []; 

    foreach($searchParams as $key => $value): 

     switch ($key): 
      case 'customerName': 
       $queryArray['customerName'] = " WHERE LOWER(CUSTOMER.LAST_NAME) LIKE ? "; 
       break; 

      case 'cardNumber': 
       $queryArray['cardNumber'] = " WHERE CUSTPHON.PHONE = ? "; 
       break; 

      case 'phoneNumber': 
       $queryArray['cardNumber'] = " WHERE CUSTPHON.PHONE = ? "; 
       break; 

      case 'customerAddress': 
       $queryArray['customerAddress'] = " WHERE LOWER(CUSTADDR.ADDRESS) LIKE ? "; 
       break; 

      case 'customerEmail': 
       $queryArray['customerEmail'] = " WHERE LOWER(CUSTOMER.EMAIL) LIKE ? "; 
       break; 

     endswitch; 

    endforeach; 

die Erste Abfrage:

$queryString = implode(' OR ', $queryArray); 

    $query1 = "SELECT CUSTOMER.LAST_NAME,CUSTOMER.DOB,CUSTOMER.EMAIL,CUSTPHON.PHONE,CUSTOMER.CUST_ID,CUSTOMER.DATE_LAST,CUSTOMER.ORD_COUNT 
     FROM CUSTOMER 
     RIGHT JOIN CUSTPHON 
     ON CUSTOMER.CUST_ID=CUSTPHON.CUST_ID 
     RIGHT JOIN CUSTADDR 
     ON CUSTOMER.CUST_ID=CUSTADDR.CUST_ID 
     {$queryString} 
     GROUP BY CUSTOMER.CUST_ID 
     ORDER BY CUSTOMER.LAST_NAME 
     "; 

    $pdo->prepareQuery($query1); 

    $i = 1; 

    foreach($searchParams as $key => $value): 

     switch ($key): 
      case 'cardNumber': 

       $cardNumber = $value; 

       if(strlen($value) == 7) 
        $cardNumber = '123' . (string)$value; 

       $pdo->bind($i, $cardNumber); 

       break; 

      case 'customerName': 
      case 'customerEmail': 
      case 'customerAddress': 
       $pdo->bind($i, "%$value%"); 
      break; 

     endswitch; 

     $i++; 
    endforeach; 
+0

Got a * komplette * Fehler Mitteilung für uns so sehen wir müssen nicht Was genau ist 42000? – deceze

+0

Warum so viele 'WHERE' Einträge? Es wäre schön, die SQL-Anweisung zu sehen, sobald sie zur Ausführung bereit ist. Auch der Eintrag für 'phoneNumber' verweist auf 'cardNumber' ~' $ queryArray [' cardNumber '] = "WHERE CUSTPHON.PHONE =?"; "?? – RamRaider

+0

Hmm, ich denke das ist der Fall (extra wo). Ich muss das überprüfen. – Sasha

Antwort

1

Der Fehler scheint zu sein, dass Sie mehrere WHERE-Klauseln haben.

Versuchen Sie dies Ihre bauen WHERE-Klausel:

$queryArray = []; 

    foreach($searchParams as $key => $value): 

     switch ($key): 
      case 'customerName': 
       $queryArray['customerName'] = " LOWER(CUSTOMER.LAST_NAME) LIKE ? "; 
       break; 

      case 'cardNumber': 
       $queryArray['cardNumber'] = " CUSTPHON.PHONE = ? "; 
       break; 

      case 'phoneNumber': 
       $queryArray['cardNumber'] = " CUSTPHON.PHONE = ? "; 
       break; 

      case 'customerAddress': 
       $queryArray['customerAddress'] = " LOWER(CUSTADDR.ADDRESS) LIKE ? "; 
       break; 

      case 'customerEmail': 
       $queryArray['customerEmail'] = " LOWER(CUSTOMER.EMAIL) LIKE ? "; 
       break; 

     endswitch; 

    endforeach; 

Und dies Ihre Abfrage erstellen:

$queryString = implode(' AND ', $queryArray); // Or you can use ' OR ', depending on what results you want 

$query1 = 'SELECT CUSTOMER.LAST_NAME,CUSTOMER.DOB,CUSTOMER.EMAIL,CUSTPHON.PHONE,CUSTOMER.CUST_ID,CUSTOMER.DATE_LAST,CUSTOMER.ORD_COUNT 
    FROM CUSTOMER 
    RIGHT JOIN CUSTPHON 
    ON CUSTOMER.CUST_ID=CUSTPHON.CUST_ID 
    RIGHT JOIN CUSTADDR 
    ON CUSTOMER.CUST_ID=CUSTADDR.CUST_ID 
    ' . ($queryString != '' ? ' WHERE ' . $queryString : '') . ' 
    GROUP BY CUSTOMER.CUST_ID 
    ORDER BY CUSTOMER.LAST_NAME 
    '; 
+0

Wie @RamRaider angemerkt haben, müssen Sie möglicherweise auch Ihre "CardNumber" und "PhoneNumber" Bedingungen überprüfen, sie sind die gleichen. – roberto06

+0

Das extra WHERE war das Problem. phoneNumber und cardNumber sind verschiedene Felder im Formular, aber es ist das gleiche Feld in der Tabelle (versucht, dies dem Client zu erklären, aber er will immer noch zwei Felder (nicht mein Projekt, nur versuchen, die Suche zu aktualisieren)). Danke für die Hilfe :) – Sasha

+0

Jetzt muss ich sehen, warum es lange dauert, die Abfrage auszuführen, wenn ich cardNumber/phoneNumber verwende. – Sasha

Verwandte Themen