7398


失礼します。  
一つ前のページから値をいくつか持ってきて、それらを合わせてSQL文にし実行するためのコードを書いています。  
エラー内容は以下の通りです。

> Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter  
>  number: parameter was not defined in  
>  C:\phpdocs\ec\syaeikan\rs\result.php on line 138

プレースホルダにバインドする値の数が合っていないというエラーなのでしょうか。  
自分では解決できなかったので、どこが間違っていて、どう直せばよいのかを教えていただきたいです。

コードは以下の通りです。

[code]

        //DB情報取得
        include "db.php";
    
        if(!isset($_SESSION['es'])){
            $_SESSION['es'] = array();
        }
    
        //クエリ前半準備
        $query = 'SELECT * FROM t_goods_tbl,t_maker_tbl WHERE';
    
        $sql_color = "";
        $sql_maker = "";
    
        //POSTデータの受信
        //色指定
        for($i=1;$i<=14;$i++){
            if(isset($_POST[$i])){
                $color[] = $_POST[$i];
            }
        }
        var_dump($color);
    
        $count_c = count($color);
    
        for($i=0;$i<$count_c;$i++){
            if($i!="0"){
                $sql_color = $sql_color." OR ";
            }
            $sql_color = $sql_color."f_goods_color=:color".$color[$i];
        }
        var_dump($sql_color);
    
        //メーカー指定
        for($i=16;$i<=20;$i++){
            if(isset($_POST[$i])){
                $maker[] = $_POST[$i];
            }
        }
        var_dump($maker);
    
        $count_m = count($maker);
    
        for($i=0;$i<$count_m;$i++){
            if($i!="0"){
                $sql_maker = $sql_maker." OR ";
            }
            $sql_maker = $sql_maker." f_goods_maker=:maker".$maker[$i];
        }
        var_dump($sql_maker);
    
    
    
        //セッションの中身を変数に移す
        if(isset($_SESSION['es'])){
            $es = $_SESSION['es'];
        }
        var_dump($es);
    
        //sql文の用意
    if($count_c != 0){
        if($count_m != 0){
            //色指定もメーカー指定もある場合
            $query = $query.$es."AND ".$sql_color." AND".$sql_maker;
        }else{
            //色指定のみある場合
            $query = $query.$es."AND".$sql_color;
        }
    }else if($count_m != 0){
        //メーカー指定のみある場合
        $query = $query = $query.$es."AND".$sql_maker;
    }else{
        //色、メーカー指定が無い場合
        $query = $query.$es;
    }
    
    var_dump($query);
    
    //SQL実行処理
    $stmt = $pdo->prepare($query);
    if($count_c != 0){
        for($i=0;$i<$count_c;$i++){
            $holder = ':color'.$i;
            $stmt->bindParam($holder,$color[$i],PDO::PARAM_STR);
        }
        if($count_m != 0){
            for($i=0;$i<$count_m;$i++){
                $holder_2 = ':maker'.$i;
                $stmt->bindParam($holder_2,$maker[$i],PDO::PARAM_STR);      
            }
            //色指定もメーカー指定もある場合
            $stmt->execute();
        }else{
            //色指定のみある場合
            $stmt->execute();
        }
    }else if($count_m != 0){
            for($i=0;$i<$count_m;$i++){
                $holder_2 = ':maker'.$i;
                $stmt->bindParam($holder_2,$maker[$i],PDO::PARAM_STR);      
            }
            //メーカー指定のみある場合
            $stmt->execute();
    }else{
        //色、メーカー指定が無い場合
        $stmt->execute();
    }
    
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
[/code]

line138に当たる部分は

> //色指定もメーカー指定もある場合  
>  $stmt->execute();

こちらです。  
前後のコードや途中の関係ないであろう一部のコードは除いています。  
勉強中の身とはいえコードが汚くて申し訳ないですが、改善点を教えていただきたいです。  
よろしくお願いします。

追記：  
dumpの出力結果です。

[code]

    array (size=3)
      0 => string '2' (length=1)
      1 => string '4' (length=1)
      2 => string '7' (length=1)
    
    string 'f_goods_color=:color2 OR f_goods_color=:color4 OR f_goods_color=:color7' (length=71)
    
    array (size=1)
      0 => string '10' (length=2)
    
    string ' f_goods_maker=:maker10' (length=23)
    
    string ' f_goods_price <= 10000 ' (length=24)
    
    string 'SELECT * FROM t_goods_tbl,t_maker_tbl WHERE f_goods_price <= 10000 AND f_goods_color=:color2 OR f_goods_color=:color4 OR f_goods_color=:color7 AND f_goods_maker=:maker10' (length=169)
    
[/code]


CC BY-SA 3.0
2015-03-03T22:08:22.227
7397
2015-03-03T22:51:07.147
2015-03-03T22:25:33.930
5985
5985
question
php mysql
PDOに関するエラーが解決できない。


質問を投稿してすぐで申し訳ないのですが、エラーを改善できてしまった事と新たな問題点の発覚がありましたので、自分で回答をさせていただきます。

今回のエラーは

> Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter  
>  number: parameter was not defined in  
>  C:\phpdocs\ec\syaeikan\rs\result.php on line 138  
>  というものでした。  
>  原因は、
[code]

    if($count_c != 0){
        for($i=0;$i<$count_c;$i++){
            $holder = ':color'.$i;
            $stmt->bindParam($holder,$color[$i],PDO::PARAM_STR);
        }
    
[/code]

このコードの3行目でした。  
コードの上の方で、

[code]

    $sql_color = $sql_color."f_goods_color=:color".$color[$i];
    
[/code]

と、$color[$i]と書いていたにも関わらず指定するときには$iのみになっていたので、値が一致していなかったのです。

原因を探ってくださった方、ありがとうございました。


CC BY-SA 3.0
2015-03-03T22:51:07.147
7398
2015-03-03T22:51:07.147
5985
7397
answer