人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP5.5とMySQL5.0.95で、以下ページのコードを試しています。
http://qiita.com/naga3/items/cacb8182ad79dbbf6e64

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

●質問者: wsapp
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

質問者から

変更した箇所は・・・

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;


1 ● きゃづみぃ
●0ポイント

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


wsappさんのコメント
ドロップとは削除の事ですか? 削除はしていませんで、項目追加をphpMyadminで行いました。 今念のため削除を行い作り直しましたが、案の定動作しません。 なぜ削除の必要があるのですか?

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

きゃづみぃさんのコメント
質問にあるのは CREATE TABLEだけでしたので ドロップしたのか 確認しただけです。 質問にある CREATE TABLE文で 項目追加を したんでしょうか?

2 ● sasada
●50ポイント

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

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

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

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

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


wsappさんのコメント
ご回答ありがとうございます。 キャッシュの問題ではなさそうです。 余っているurlがあったので、コメント項目を追加したコードで一時的にUpしました。 http://gate-x.info/ 挙動を見ていただければキャッシュの問題でないことが解ると思います。 よろしくお願いしますm(_ _)m

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との組み合わせのエラーの様です。

wsappさんのコメント
いろいろ試していただきありがとうございました。 質問に問題があったようです。 申し訳ありませんでしたm(_ _)m 教えていただいたページは熟読し自分のものにしたいと思います。 ありがとうございました。

3 ● Lhankor_Mhy
●50ポイント ベストアンサー

PHPはよく分からないのですが。

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

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

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

wsappさんのコメント
ご回答ありがとうございます。 ご明察です! @$st->execute($in); の前に $st->bindValue(':com2', is_null); を挿入したら更新できました。 フィールドを追加したのが問題になるとは考えもしませんで、質問から外していました。 PDOは1週間前から始めたばかりでイマイチ挙動が掴めていませんでした。 SQLより厳格なんですね。 ありがとうございますm(_ _)m
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ