95477


PHPにて画面上部にて条件を入力し、画面下部にて結果一覧を表示する画面を作成しています。  
where句を動的にしようと考え、試しに項目を1つで動的SQLを試みた（97行目～108行目）  
のですが、108行目でSQLSTATE[HY093]エラーが出ます。

以下の記事を見て確認してみたのですが、スペルミスも見つからず、パラメーター数の不一致も見つからず、原因が不明です。

["SQLSTATE[HY093]: Invalid parameter number" あるある](https://qiita.com/sefp-
maru/items/b8850c752def93106e34)

念のため、全エラーは下記です。

[code]

    Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\xampp\htdocs\Portfolio\news_table.php:108 Stack trace: #0 C:\xampp\htdocs\Portfolio\news_table.php(108): PDOStatement->execute() #1 {main} thrown in C:\xampp\htdocs\Portfolio\news_table.php on line 108
    
[/code]

原因調査にご協力いただければ幸いです。

ソースコードを添付します。

[code]

    <?php
    try{
        require_once("db_connect.php");
        $pdo = new PDO("mysql:host=$SERV;dbname=$DB;charset=$CHAR",$USER,$PASS);
    }
    catch(PDOException $e){echo "次がエラーの内容です。;" .$e->getMessage();
    }
    
    $sdate = $_POST['sdate'] ?? "";
    $edate = $_POST['edate'] ?? "";
    $title = $_POST['title'] ?? "";
    $content = $_POST['content'] ?? "";
    $status = $_POST['status'] ?? "";
    $clear = $_POST['clear'] ?? "";
    
    ?>
    <!doctype html>
    <html lang=ja>
        <head>
            <meta charset="utf-8">
            <title>News一覧</title>
            <meta name="description" content="Salon Yuri-rinの管理者ページ">
            <!--リセットcss-->
            <link rel="stylesheet" href="https://unpkg.com/ress/dist/ress.min.css">
            <!--css-->
            <link rel="stylesheet" href="css/news_style.css">
            <!--レスポンシブ対応-->
            <meta name="viwport" content="width=device-width, initial-scale=1">
            <!--Googleフォント-->
            <link href="https://fonts.googleapis.com/css2?family=Sawarabi+Gothic&display=swap" rel="stylesheet">
            <link href="https://fonts.googleapis.com/css2?family=Shippori+Mincho:wght@500&display=swap" rel="stylesheet">
        </head>
        <body>
            <h1>News一覧</h1>
            <table class="search_table">
            <form class="conditions" name="conditions" id="conditions" action="news_table.php" method="post">
                <tr id="date" class="date">
                    <td><label for="sdate">日付</label></td>
                    <td><input type="date" name="sdate" id="sdate" value="<?=$sdate?>"></td>
                    <td><label for="edate">～</label></td>
                    <td><input type="date" name="edate" id="edate" value="<?=$edate?>"></td>
                </tr>
                <tr>
                    <td><label for="title">タイトル</label></td>
                    <td><input type="text" name="title" id="title" value="<?=$title?>"></td>
                    <td><label for="content">内容</label></td>
                    <td><input type="text" name="content" id="content" value="<?=$content?>"></td>
                </tr>
                <tr>    
                    <td><label for="status">ステータス</label></td>
                    <td>
                        <select name="status" id="status">
                            <option value="0" 
                                <?php if($status === '0')
                                    {echo 'selected';}
                                        else if($status === '1')
                                        {echo '';}
                                            else {echo '';}?> 
                                    
                            >未選択</option>
                            <option value="1"  
                                <?php if($status === '1')
                                    {echo 'selected';}
                                        else if($status === '0')
                                            {echo '';}
                                            else {echo '';}
                                    ?>
                                >未公開</option>
                            <option value="2"  
                                <?php if($status === '2')
                                    {echo 'selected';}
                                        else if($status === '0')
                                            {echo '';}
                                            else {echo '';}
                                    ?>
                                >公開</option>
                        </select>           
                    </td>
            </form>
            </table>
            <button type="button" form="conditions" class="search_button" id="clear" name="clear" value="clear">クリア</button>
            <button type="submit" form="conditions" name="search_button" class="search_button" id='search_button' value="clear">検索</button>
            <table class="tablehead">
                <tr>
                    <th class="header">日付</th>
                    <th class="header">タイトル</th>
                    <th class="header">内容</th>
                    <th class="header">公開ステータス</th>
                    <th class="header2">
                        <form class="create" action="news_create.php">
                            <button type="submit" name="button" value="登録" class="button_a">登録</button>
                        </form>
                    </th>
                    <th class="header2"></th>
                </tr>
            </table>
            <?php
                if(isset($_POST['search_button'])){
                $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
                $sql = ('select * from news where 1=1');
                    if(isset($_POST['sdate'])){
                            $sql .= "and str_to_date('pub_date','%Y-%m-%d') >= str_to_date(':sdate','%Y-%m-%d')";
                        }
                $stmt = $pdo->prepare($sql);
                    if(isset($_POST['sdate'])){
                        $stmt->bindvalue("sdate", $_POST['sdate'], PDO::PARAM_STR);
                    }
                $stmt->execute();
                $row = $stmt->fetchAll(PDO::FETCH_ASSOC);}?>
    
                <?php foreach($row as $data):?>
                <form action="?" method="post" class = "newstblform">
                    <div class = "table1">
                        <table class="newstable">
                            <tr>
                                <input type="hidden" name="seq" value="<?=htmlspecialchars($data['id'], ENT_QUOTES | ENT_HTML5, 'UTF-8')?>" id="seq">
                            <td class="dt">
                                <label>
                                    <input type="text" name="pub_date" value="<?=htmlspecialchars($data['pub_date'], ENT_QUOTES | ENT_HTML5, 'UTF-8')?>" id="sei" readonly="readonly">
                                </label>
                            </td>
                            <td class="dt">
                                <label>
                                    <input type="text" name="title" value="<?=htmlspecialchars($data['title'], ENT_QUOTES | ENT_HTML5, 'UTF-8')?>" id=mei readonly="readonly">
                                </label>
                            </td>
                            <td class="dt">
                                <label>
                                    <input type="text" name="content" value="<?=htmlspecialchars($data['content'], ENT_QUOTES | ENT_HTML5, 'UTF-8')?>" id="sei_kana">
                                </label>
                            </td>
                            <td class="dt">
                                <label>
                                    <input type="text" name="status" value="<?=htmlspecialchars($data['status'], ENT_QUOTES | ENT_HTML5, 'UTF-8')?>" id="sei_kana">
                                </label>
                            </td>
                            <td class="bt">
                                <input type="submit" name=button value="修正" formaction="news_update.php" class="button_a">
                            </td>
                            <td class="bt">
                                <input type="submit" name=button value="削除" formaction="news_delete_conf.php" class="button_a">
                            </td>
                            </tr>
                        </table>
                    </div>
                </form>
                <?php endforeach; ?>
            <?php require_once('newslist_chk_js.php'); ?>
        </body>
    </html>
    
[/code]


CC BY-SA 4.0
2023-07-05T04:22:13.080
95474
2023-07-05T07:27:27.927
2023-07-05T05:24:49.767
3060
58703
question
php mariadb
PHP　PDOでSQLSTATE[HY093]


`isset($_POST['sdate'])` が true のとき， `$sql` は

[code]

    select * from news where 1=1and str_to_date('pub_date','%Y-%m-%d') >= str_to_date(':sdate','%Y-%m-%d')
    
[/code]

となると思います．  
ようは `and` の前にスペースが無いため SQL 的にエラーになっていると推測しました．

[code]

    $sql = ('select * from news where 1=1');
    if(isset($_POST['sdate'])){
        $sql .= " and str_to_date('pub_date','%Y-%m-%d') >= str_to_date(':sdate','%Y-%m-%d')";
    }
    
[/code]

みたいな感じで，and の前にスペースを入れましょう


CC BY-SA 4.0
2023-07-05T07:26:07.443
95477
2023-07-05T07:27:27.927
2023-07-05T07:27:27.927
58973
58973
95474
answer