DB自体をはじめて触ります。
PDOでデータの出し入れをしているのですがupdateの際に以下のエラーが出てきます。
Fatal error: Call to a member function bindParam() on a non-object in /サーバー内パス/example.php on line 102
色々と調べて文字コードなんかが原因である事が多いとわかりました。
今は以下のコードでデータには特に何もせずにデータをDBに放り込んでいます。
098行目 $sql = "INSERT INTO blog(id, example)
099行目 VALUES(:id, :example,)";
100行目 $conn = new PDO("sqlite:./test.sql");
101行目 $stmt = $conn->prepare($sql);
102行目 $stmt->bindParam(":id", $id);
103行目 $stmt->bindParam(":example", $example);
104行目 $stmt->execute();
105行目 $id = $conn->lastInsertId();
IDやexampleにはPOSTのデータがそのまま入っています。
そこで質問なのですが、DBに入れる放り込む際にやった方がよいことが以下でいいかどうか教えてください。
文字コードの変換とHTMLエンティティに変換
$_POST['id'] = mb_convert_encoding($_POST['id'], "UTF-8", "auto");
$_POST['id'] = htmlspecialchars($_POST['id']);
insertとupdateではまた違うのかもしれませんが、DBにデータを入れる際にやったほうがいいことや気をつけた方がよい事があればご教示ください。
文字コードの問題でなくて、SQL文が間違ってるんだと思いますが・・・。
http://d.hatena.ne.jp/pidgeot/20100730/1280510910
http://learnaboutphpmysql.blogspot.com/2010/10/call-to-member-fu...
(1)改行コードが入ってしまっている
098行目 $sql = "INSERT INTO blog(id, example)
099行目 VALUES(:id, :example,)";
↓
098行目 $sql = "INSERT INTO blog(id, example) VALUES(:id, :example,)";
(2)エスケープしなければならない文字が含まれている
sqlite_escape_string
全角スペースなどを混ぜるとnon-objectって言われたから、まぁ、どっちにしても $sql の中身を良く見直してもらうしかないですね
なんかそもそもの所をだれもちゃんと指摘してないのが不思議だが、
このエラーは直訳しても解るとおりオブジェクトでない物に対し、メソッド呼び出しを行おうとした場合の物。
つまり直前で行っている、
$stmt = $conn->prepare($sql);
これですでにエラーが出て $stmt にオブジェクトが帰ってきていない。
それはそれとして文字コード周りの処理はPDOの仕様でめんどくさい事になってるようだ。
http://www.tokumaru.org/d/20100701.html
最新の事情は知らないけどね。
拒否られているのにコメント欄に回答を投稿しようという傲岸不遜
他の回答者が投稿しにくくなることに対してはお構いなし
プログラムを掲載するのではなく、プログラムを動かして出来上がった $sql を echo で出力して、まずは自分で確認してみてください
それこそが解決への近道ですよ
>var_dumpした際にも3や4といったものが出力された
質問文や返信欄では $id などとなっているけれど、実際には配列になってたりしませんか?
質問用に自分なりに削ったのだと思いますが、削った部分にこそ問題点が隠されていますね
PDOの問題に関してはUTF-8に統一されている限りにおいては問題ないと言って良いと思いますが、環境整備もままならぬ状況の人も多いですから、忘れてはいけない問題ではありますね
以前の質問も根本的問題点は環境整備であったと思うのですが、その後、どのように整えたのかについては確認を要するかもしれません
http://q.hatena.ne.jp/1287795575
すいません。基本的に回答権についてはデフォルトでいじってませんので設定といわれましてもなんともいえません。
いくつか見直しをしてみてる中でsqlite_escape_stringについてはとても参考になりました。
またこちらに掲載するにあたり削ったものとしては変数のみで、それ以外はそのままになります。
変数も配列などではなく半角英数字のみのものです。
環境にも問題があるのかもしれませんがPDOでの受け渡しをいったんやめてsqlite文にすることで正常に動くことを確認しました。
b-wind 様
回答ありがとうございます。
PDOではなくsqlite文で行うことでデータの出し入れを行うようにしました。
扱うデータ自体は同じなのでPDOの扱いに対する理解が不足していたとしかいえません。
データベース自体を扱うのが初めてではあるので普段からデータベースを使用されているかたからすれば
おかしな点が山盛りだったかと思いますが、少しずつでも良いので進めればと思っております。
皆さん回答ありがとうございました。
問題点とすればprepareが無いという点ですが、個人用としてローカルで使うのであれば、SQLインジェクションの脅威におびえることも特にないので、SQLiteモジュールのほうがやっぱり楽ですね(SQLインジェクションについても学んでくださいね)
SQLiteモジュールで、どのようなことが出来るかについては下記も覗いてみてください(sqlite_escape_stringもマニュアルページを見ていれば…ってのはもうよしておきます)
http://jp.php.net/manual/ja/book.sqlite.php
話は変わって回答権についてですが、下記のユーザーページにある「他ユーザーの設定による回答拒否」の設定になります
http://q.hatena.ne.jp/quocard/config
デフォルトは「拒否しない」になってるはずなので、過去のどこかの時点でご自身で変更なさったということになります
「拒否しない」に設定変更することによって、必ずしもプラスになるというものでもありませんので、別に今のままでも結構だとは思いますが、そういった設定方法があるということを知っておくと便利だと思います
この人には回答してほしくないと思った場合には回答拒否ユーザーにアカウント名を入れてしまうという手もあります(コメント欄やいわし質問には効きません。人力検索形式の回答欄への投稿だけができなくなるという設定です)
何はともあれ、あせらず、がんばってください