私はクイックpdoクエリを作成しなければなりませんでした(これは非常に古いサイトで、フレームワークを使用できません)。PHP PDOクエリSQLSTATE [42000]エラー
(単一のパラメータでは正常に動作しますが、2つ以上のパラメータを組み合わせるとSQLSTATE [42000]エラーが発生します)。
完全なエラー:デシベルで
<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
ライン104は、クエリを実行するためのものである:
public function execute(){
return $this->stmt->execute();
}
ここで間違っていますか?
私はこの(私が使用されるのparam分からない)のようなフォームからデータを取得しています:
$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'])));
そして、これは私がクエリを作成する方法である:
$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;
取得クエリ:
$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;
は、私たちのために*完全な*エラーメッセージが表示されましたが'42000'はまさに何ですか? – deceze
なぜ多くの 'WHERE'エントリ? SQL文の実行準備が整ったら、SQL文を見るといいでしょう。また、 'phoneNumber'のエントリは' cardNumber'〜 '$ queryArray ['cardNumber'] ="どこCUSTPHON.PHONE =? "を参照していますか? – RamRaider
ええと、私はこれが事実だと思います(余分な場所)。私はこれを確認する必要があります。 – Sasha