65403


メッセージ投稿機能を作っていた際、下記のようなエラーメッセージが表示されました。この場合、どう対処すれば良いのでしょうか。

array(3) { [0]=> string(5) "00000" [1]=> NULL [2]=> NULL }

ちなみに、以下がindex.phpのコードです

[code]

    <?php
    session_start();
    require('dbconnect.php');
    
    if(isset($_SESSION['id']) && $_SESSION['time']+ 3600> time()) {
      $_SESSION['time'] = time();
    
      $members = $db->prepare('SELECT * FROM members WHERE id=?');
      $members->execute(array($_SESSION['id']));
      $member = $members->fetch();
    } else {
      header('Location: login.php');
      exit();
    }
    if (!empty($_POST)) {
      if ($_POST['message'] !== '') {
        $message = $db->prepare('INSERT INTO posts SET member_id=?, message=?, created=NOW()');
        $message->execute(array(
          $memeber['id'],
          $_POST['message']
        ));
        var_dump($message->errorInfo()); // ここ
        exit();
    
        header('Location: index.php');
        exit();
      }
    }
    $posts = $db->query('SELECT m.name, m.picture, p.* FROM members m, posts p WHERE m.id=p.member_id ORDER BY created DESC');
    ?>
    <!DOCTYPE html>
    <html lang="ja">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>ひとこと掲示板</title>
    
      <link rel="stylesheet" href="style.css" />
    </head>
    
    <body>
    <div id="wrap">
      <div id="head">
        <h1>ひとこと掲示板</h1>
      </div>
      <div id="content">
        <div style="text-align: right"><a href="logout.php">ログアウト</a></div>
        <form action="" method="post">
          <dl>
            <dt><?php echo htmlspecialchars($member['name'], ENT_QUOTES) ?>さん、メッセージをどうぞ</dt>
            <dd>
              <textarea name="message" cols="50" rows="5"></textarea>
              <input type="hidden" name="reply_post_id" value="" />
            </dd>
          </dl>
          <div>
            <p>
              <input type="submit" value="投稿する" />
            </p>
          </div>
        </form>
    
    <?php foreach($posts as $post): ?>
        <div class="msg">
        <img src="member_picture/<?php echo htmlspecialchars($post['picture'], ENT_QUOTES) ?>" width="48" height="48" alt="<?php echo htmlspecialchars($post['name'], ENT_QUOTES) ?>" />
        <p><?php echo htmlspecialchars($post['message'], ENT_QUOTES) ?><span class="name">（<?php echo htmlspecialchars($post['name'], ENT_QUOTES) ?>）</span>[<a href="index.php?res=">Re</a>]</p>
        <p class="day"><a href="view.php?id="><?php echo htmlspecialchars($post['created'], ENT_QUOTES) ?></a>
    <a href="view.php?id=">
    返信元のメッセージ</a>
    [<a href="delete.php?id="
    style="color: #F33;">削除</a>]
        </p>
        </div>
    <?php endforeach; ?>
    <ul class="paging">
    <li><a href="index.php?page=">前のページへ</a></li>
    <li><a href="index.php?page=">次のページへ</a></li>
    </ul>
      </div>
    </div>
    </body>
    </html>
    
[/code]


CC BY-SA 4.0
2020-04-06T06:27:38.697
65391
2020-04-06T11:55:55.893
2020-04-06T11:55:55.893
19110
36669
question
php pdo
PDOエラーについて


それは「エラーメッセージ」ではありません。

[`PDOStatement::errorInfo`](https://www.php.net/manual/ja/pdostatement.errorinfo.php)は、SQLの実行が成功しても失敗しても、必ず要素数が3の配列を返します。

その第[0]要素は、

> 0 SQLSTATE エラーコード (これは、ANSI SQL 標準で定義された英数 5 文字の ID)

とあります。あなたが取得した`"00000"`は、正常終了を表すコードですので、SQLの実行が成功したことを表しています。

それを`var_dump`すれば、必ず`array(3) { [0]=> ...
}`といった出力がされますが、第[0]要素が`"00000"`ならば成功なので、`exit()`で強制終了する必要はありません。正常時の処理を続けてください。

* * *

ただし、[`PDOStatement::execute`](https://www.php.net/manual/ja/pdostatement.execute.php)の戻り値は、

> ### 返り値
>
> * * *
>
> 成功した場合に **`TRUE`** を、失敗した場合に **`FALSE`** を返します。

とありますので、戻り値が **`TRUE`** の場合には`errorInfo()`を参照する必要はありません。

[code]

    if (isset($_POST['message'])) {
        if ($_POST['message'] !== '') {
            $message = $db->prepare('INSERT INTO posts SET member_id=?, message=?, created=NOW()');
            $success = $message->execute(array(
                $memeber['id'],
                $_POST['message']
            ));
            if( $success ) {
                //`execute`が成功したときの処理
                header('Location: index.php');
                exit();
            } else {
                //`execute`が失敗したときの処理
                var_dump($message->errorInfo()); 
                exit();
            }
        }
    }
    
[/code]

コードの他の部分はほとんど読んでいないので、「`execute`が成功したとき」にも所望の動作とならないのかもしれませんが、それは`errorInfo()`の今回の出力結果とは関係ありません。


CC BY-SA 4.0
2020-04-06T11:49:18.600
65403
2020-04-06T11:49:18.600
2020-06-17T08:14:45.997
-1
13972
65391
answer