PHP5.5とMySQL5.0.95で、以下ページのコードを試しています。

http://qiita.com/naga3/items/cacb8182ad79dbbf6e64

サンプルはコピペで正常動作するのですが
項目を増やしてみようと試しますが更新がうまくいきません。
削除・新規追加・一覧表示はうまく動作します。
更新だけが動作しません。
どなたか、ご指導いただけないでしょうか?
変更した個所は補足へ記載しています。
よろしくお願いします。

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2014/09/22 11:40:27
  • 終了:2014/09/24 21:57:35
id:wsapp

質問者から

wsapp2014/09/22 19:22:42

変更した箇所は・・・

controller.js
は変更していません。

sql

CREATE TABLE students(
  id SERIAL PRIMARY KEY,
  name VARCHAR(255),
  age INT,
  comment TEXT
);

上記を以下へ
CREATE TABLE students(
  id SERIAL PRIMARY KEY,
  name VARCHAR(255),
  age INT,
  comment TEXT,
  com1 TEXT
);




index.html

<body ng-controller="MainCtrl">
  <table border="1">
    <tr><th>ID</th><th>名前</th><th>年齢</th><th>コメント</th></tr>
    <tr ng-controller="DetailCtrl" ng-repeat="student in students">
      <td>{{student.id}}</td>
      <td><input ng-model="student.name"></td>
      <td><input ng-model="student.age"></td>
      <td><input ng-model="student.comment"></td>
      <td><button ng-click="update()">更新</button></td>
      <td><button ng-click="delete($index)">削除</button></td>
    </tr>
  </table>
  <button ng-click="add()">追加</button>
</body>

上記を以下へ

<body ng-controller="MainCtrl">
  <table border="1">
    <tr><th>ID</th><th>名前</th><th>年齢</th><th>コメント</th><th>com1</th></tr>
    <tr ng-controller="DetailCtrl" ng-repeat="student in students">
      <td>{{student.id}}</td>
      <td><input ng-model="student.name"></td>
      <td><input ng-model="student.age"></td>
      <td><input ng-model="student.comment"></td>
      <td><input ng-model="student.com1"></td> <!--追加-->
      <td><button ng-click="update()">更新</button></td>
      <td><button ng-click="delete($index)">削除</button></td>
    </tr>
  </table>
  <button ng-click="add()">追加</button>
</body>



students.php

case 'PUT':
  // update
  $in = json_decode(file_get_contents('php://input'), true);
  $st = $pdo->prepare("UPDATE students SET name=:name,age=:age,comment=:comment WHERE id=:id");
  @$st->execute($in);
  break;

上記を以下へ
case 'PUT':
  // update
  $in = json_decode(file_get_contents('php://input'), true);
  $st = $pdo->prepare("UPDATE students SET name=:name,age=:age,comment=:comment,com1=:com1 WHERE id=:id");
  @$st->execute($in);
  break;

ベストアンサー

id:Lhankor_Mhy No.3

Lhankor_Mhy回答回数779ベストアンサー獲得回数2312014/09/22 16:29:23

ポイント50pt

PHPはよく分からないのですが。
 
DBにcom2というフィールドがありますか?
「更新」を押すとPUTリクエストにcom2がnull値が送られますが、「追加」→「更新」だとcom2が送られていないようです。
ということで、↓これが原因では。

内容がNULLであればIS NULLとしたいのですが、 PDO::ATTR_EMULATE_PREPARES を false にしている関係上 prepareの段階でエラーになってしまいます。

PDO mysqlでWHEREのプレースホルダにNULLをセットしたい - PHPプロ!Q&A掲示板
id:wsapp

ご回答ありがとうございます。
ご明察です!

@$st->execute($in);
の前に
$st->bindValue(':com2', is_null);
を挿入したら更新できました。

フィールドを追加したのが問題になるとは考えもしませんで、質問から外していました。
PDOは1週間前から始めたばかりでイマイチ挙動が掴めていませんでした。
SQLより厳格なんですね。
ありがとうございますm(_ _)m

2014/09/22 18:10:35

その他の回答(2件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982014/09/22 12:46:03スマートフォンから投稿

テーブルは一度ドロップしてからクリエイトしましたか?

他1件のコメントを見る
id:wsapp

動作しないのは、更新だけで追加は正常動作します。
コードを見ると、追加はIDだけのレコードを挿入して、その後更新処理を行っているのか?と思っています。
素人解釈なので、間違っていたらすみません。
追加ができて更新ができないのが不思議でなりません。

2014/09/22 13:11:30
id:taknt

質問にあるのは CREATE TABLEだけでしたので ドロップしたのか 確認しただけです。

質問にある CREATE TABLE文で 項目追加を したんでしょうか?

2014/09/23 01:23:47
id:sasada No.2

sasada回答回数1482ベストアンサー獲得回数1332014/09/22 14:32:24

ポイント50pt

 更新だけがうまく行かない理由は、SQLのUPDATEだけが項目名を明示して実行しているからでしょうか。

 それはさておき、プログラムに間違いは見当たらない様に思えます。
 思うに、更新処理でcom1以外の項目は更新されるなら、キャッシュが生きていて新しいstudents.phpが読み込まれていないのではないでしょうか。
 その場合、一度、students.phpの名前をstudents01.phpとかに変えて、controller.jsを

  var Student = $resource('students01.php', {}, {

としてみては如何でしょうか。

 更新処理全体が実行されていないなら、また考えなくてはなりませんね。。。

他1件のコメントを見る
id:sasada

 試してみると、追加処理をした後、再読み込みをせずに更新処理を続けていると更新できますね。途中で追加はしても、更新できます。
 再読み込みするとあとは更新できません。

 うーん。これを考えると、file_get_contents('php://input'),に成功するかどうかに関わっているのかもしれません。
 PHP5.5の場合、以下の仕様が関係しているかもしれません。
http://php.net/manual/ja/wrappers.php.php

PHP 5.6 より前のバージョンでは、 php://input でオープンしたストリームは、一度しか読み込めません。 また、このストリームは seek 操作をサポートしていません。 しかし、SAPI の実装によっては、別の php://input ストリームをオープンして読み込みを再開できる可能性もあります。 これは、リクエストの body 部のデータが保存されている場合にのみ可能となります。 通常、POST リクエストの場合はそのようになりますが、 PUT や PROPFIND といった他のメソッドの場合は保存されません。

 テスト環境が5.6なら、別の理由でしょうけど。
 とりあえず、GETとの組み合わせのエラーの様です。

2014/09/22 15:35:05
id:wsapp

いろいろ試していただきありがとうございました。
質問に問題があったようです。
申し訳ありませんでしたm(_ _)m

教えていただいたページは熟読し自分のものにしたいと思います。
ありがとうございました。

2014/09/22 18:12:45
id:Lhankor_Mhy No.3

Lhankor_Mhy回答回数779ベストアンサー獲得回数2312014/09/22 16:29:23ここでベストアンサー

ポイント50pt

PHPはよく分からないのですが。
 
DBにcom2というフィールドがありますか?
「更新」を押すとPUTリクエストにcom2がnull値が送られますが、「追加」→「更新」だとcom2が送られていないようです。
ということで、↓これが原因では。

内容がNULLであればIS NULLとしたいのですが、 PDO::ATTR_EMULATE_PREPARES を false にしている関係上 prepareの段階でエラーになってしまいます。

PDO mysqlでWHEREのプレースホルダにNULLをセットしたい - PHPプロ!Q&A掲示板
id:wsapp

ご回答ありがとうございます。
ご明察です!

@$st->execute($in);
の前に
$st->bindValue(':com2', is_null);
を挿入したら更新できました。

フィールドを追加したのが問題になるとは考えもしませんで、質問から外していました。
PDOは1週間前から始めたばかりでイマイチ挙動が掴めていませんでした。
SQLより厳格なんですね。
ありがとうございますm(_ _)m

2014/09/22 18:10:35

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません