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;
Got a * komplette * Fehler Mitteilung für uns so sehen wir müssen nicht Was genau ist 42000? – deceze
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
Hmm, ich denke das ist der Fall (extra wo). Ich muss das überprüfen. – Sasha