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...
098行目 $sql = "INSERT INTO blog(id, example)
099行目 VALUES(:id, :example,)";
このSQLで
id, example に :id, :example, を 入れるというようなっていますが、カンマの数が合わないため、通常は このSQL自体でエラーになると思いますよ。
ご指摘ありがとうございます。
こちらに写したさいに紛れ込んでしまったようです。
実際に使用しているものは
99行目 VALUES(:id, :example)";
となっております。
>エスケープしなければならない文字が含まれている
この可能性を疑っておられるのかもしれませんが、
INSRTでも、同じ文字列のデータを格納するのなら同じ現象がでると思います。
bindする場合は、エスケープは必要ありません。
UODATEで$id、$exampleの値が英数字だけの場合でも出るかどうかを確認して
いただけるでしょうか?
これで、正常にUPDATEされるが、他のデータでは質問文のようにエラーになると
いうのなら、SQL文は間違えていないでしょう。
英数字だけでもエラーになるのでしたら、エスケープとかの問題ではないと思います。
もし可能なら、
エラーが出る実際のSQL文と:example等の値を教えていただけませんか?
すいません。
実際には以下の2つでINSERTとUPDATEを行っております。
追加
$sql = "INSERT INTO blog(id, example)
VALUES(:id, :example)";
$conn = new PDO("sqlite:./test.sql3");
$stmt = $conn->prepare($sql);
$stmt->bindParam(":id", $id);
$stmt->bindParam(":example", $example);
$stmt->execute();
$id = $conn->lastInsertId();
更新
$sql = "UPDATE blog SET
id = :id,
example = :example,
WHERE id = :id";
$conn = new PDO("sqlite:./test.sql3");
$stmt = $conn->prepare($sql);
$stmt->bindParam(":id", $id);
$stmt->bindParam(":example", $example);
$stmt->execute();
エラーについてですが、エラーが出ていた102行目 $stmt->bindParam(":id", $id);の中身は英数字(0=9)になります。
直前でvar_dumpした際にも3や4といったものが出力されたので問題はないと思います。
exampleの中身は日本語文章が入っています。文字コードはサーバー含めて全てUTF-8となっているので
UTF-8になっているのではないかと思います。
ご指摘ありがとうございます。
質問にもありますようにそちらのコードでINSERT自体は行えております。
正常に動いているように見えているけど実際には違っているということでしょうか?