PDOで起きた問題

  • 学校の講義でPDOを使う機会があり、かなり苦しめられたのでメモ代わりに残します。
  • 解決できませんでした。

JavaScriptPHPSQLを使ってデータベースの内容を非同期通信でウェイ!って表形式で表示する内容なのです。

コード

<?php

// 省略

// 追記部分
  if ($_POST['id'] == null && $_POST['name'] != null && $_POST['address'] != null && $_POST['email'] != null) {
      $name = $_POST['name'];
      $address = $_POST['address'];
      $email = $_POST['email'];
      $stmt = $pdo -> prepare("INSERT INTO ".table."(name, address, email) VALUES (?, ?, ?)");
      $stmt->bindParam(1, $name, PDO::PARAM_STR);
      $stmt->bindParam(2, $address, PDO::PARAM_STR);
      $stmt->bindParam(3, $email, PDO::PARAM_STR);
      $stmt->execute();
      $stmt = $pdo->prepare("SELECT * FROM ".table);
      $stmt -> execute();
      $result = $stmt->fetchALL(PDO::FETCH_ASSOC);
  }

// この後、$resultをjson_encodeしてechoで出力する
?>

id以外テキストボックスに何かしらの文字が書かれている場合、INSERT文で挿入し、その後SELECT文で全件取得するという内容です。 何も考えずにそのまま実行したところ、表が表示されない・・・

要素を検証したところ

Uncaught TypeError: Cannot read property 'insertCell' of undefined

は?

どうやら連想配列を要素とした配列として返すはずなのに、挿入した内容のみをresponseされたせいで、存在しないよってエラー吐いてるみたいです。 一応追加自体は出来ていますが、モヤモヤするので直します。

SAの方とあれこれ試してみるも結局できない。 仕様か?と悩み始めたところで

PDOStatement::closeCursor() 使うのでは?

とのアドバイスを受け修正。

PHP: PDOStatement::closeCursor - Manual

<?php

// 省略

// 追記部分
  if ($_POST['id'] == null && $_POST['name'] != null && $_POST['address'] != null && $_POST['email'] != null) {
      $name = $_POST['name'];
      $address = $_POST['address'];
      $email = $_POST['email'];
      $stmt = $pdo -> prepare("INSERT INTO ".table."(name, address, email) VALUES (?, ?, ?)");
      $stmt->bindParam(1, $name, PDO::PARAM_STR);
      $stmt->bindParam(2, $address, PDO::PARAM_STR);
      $stmt->bindParam(3, $email, PDO::PARAM_STR);
      $stmt->execute();
      $stmt->closeCursor();
      $stmt = $pdo->prepare("SELECT * FROM ".table);
      $stmt -> execute();
      $result = $stmt->fetchALL(PDO::FETCH_ASSOC);
  }

// この後、$resultをjson_encodeしてechoで出力する
?>

これだと思いながら実行したところ

Uncaught TypeError: Cannot read property 'insertCell' of undefined

f:id:be_07:20160610192407j:plain

もう打つ手がなかったので、$pdoをnullにするという暴挙に出ました。

<?php

// 省略

// 追記部分
  if ($_POST['id'] == null && $_POST['name'] != null && $_POST['address'] != null && $_POST['email'] != null) {
      $name = $_POST['name'];
      $address = $_POST['address'];
      $email = $_POST['email'];
      $stmt = $pdo -> prepare("INSERT INTO ".table."(name, address, email) VALUES (?, ?, ?)");
      $stmt->bindParam(1, $name, PDO::PARAM_STR);
      $stmt->bindParam(2, $address, PDO::PARAM_STR);
      $stmt->bindParam(3, $email, PDO::PARAM_STR);
      $stmt->execute();
      $stmt->closeCursor();
      $pdo = null;
      $pdo = new PDO('mysql:host='.host.';dbname='.dbname,user,pass, $options);
      $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $stmt = $pdo->prepare("SELECT * FROM ".table);
      $stmt -> execute();
      $result = $stmt->fetchALL(PDO::FETCH_ASSOC);
  }

// この後、$resultをjson_encodeしてechoで出力する
?>

祈るような気持ちで実行したところ

Uncaught TypeError: Cannot read property 'insertCell' of undefined

f:id:be_07:20160610191552j:plain

結局

JavaScript側でどうにかしました。 結局できなかったのは自分ができないだけなのか、PDOの仕様なのか分からずじまいでした・・・

最後に

f:id:be_07:20160610192559p:plain