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

sqlite3での質問です。
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にデータを入れる際にやったほうがいいことや気をつけた方がよい事があればご教示ください。

●質問者: quocard
●カテゴリ:インターネット ウェブ制作
✍キーワード:blog dB HTML object ON
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● hanako393
●27ポイント

文字コードの問題でなくて、SQL文が間違ってるんだと思いますが・・・。

http://d.hatena.ne.jp/pidgeot/20100730/1280510910

http://learnaboutphpmysql.blogspot.com/2010/10/call-to-member-fu...

◎質問者からの返答

ご指摘ありがとうございます。

質問にもありますようにそちらのコードでINSERT自体は行えております。

正常に動いているように見えているけど実際には違っているということでしょうか?


2 ● kopj
●27ポイント

098行目 $sql = "INSERT INTO blog(id, example)

099行目 VALUES(:id, :example,)";


このSQLで

id, example に :id, :example, を 入れるというようなっていますが、カンマの数が合わないため、通常は このSQL自体でエラーになると思いますよ。

◎質問者からの返答

ご指摘ありがとうございます。

こちらに写したさいに紛れ込んでしまったようです。

実際に使用しているものは

99行目 VALUES(:id, :example)";

となっております。


3 ● pretaroe
●26ポイント

>エスケープしなければならない文字が含まれている

この可能性を疑っておられるのかもしれませんが、

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になっているのではないかと思います。

関連質問


●質問をもっと探す●



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