2016-07-22 16 views
-1

私はクイック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; 
+0

は、私たちのために*完全な*エラーメッセージが表示されましたが'42000'はまさに何ですか? – deceze

+0

なぜ多くの 'WHERE'エントリ? SQL文の実行準備が整ったら、SQL文を見るといいでしょう。また、 'phoneNumber'のエントリは' cardNumber'〜 '$ queryArray ['cardNumber'] ="どこCUSTPHON.PHONE =? "を参照していますか? – RamRaider

+0

ええと、私はこれが事実だと思います(余分な場所)。私はこれを確認する必要があります。 – Sasha

答えて

1

エラーは複数のWHERE句があるようです。

あなたのWHERE句構築するために、これを試してみてください:

$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; 

そして、このクエリを構築するために:私たちは、ルックアップする必要はありませんので、

$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

@RamRaiderは、「CardNumber」と「phoneNumber」の条件を確認する必要がある場合もあります。 – roberto06

+0

追加の問題がありました。 phoneNumberとcardNumberはフォームの異なるフィールドですが、これはテーブルの同じフィールドです(これをクライアントに説明しようとしましたが、彼はまだ2つのフィールドを必要とします(私のプロジェクトではなく、検索を更新しようとしています)。助けてくれてありがとう:) – Sasha

+0

今私はcardNumber/phoneNumberを使用するときにクエリを実行するのに時間がかかる理由を知る必要があります。 – Sasha

関連する問題