質問: PHPのプラミングの質問です。 初心者で勉強中です。 sqlite を使ってチャットのプログラムをサーバーにアップロードをするとうまく動きます。 sqliteで接続する部分をmysqlに直してサーバにアップして接続すると 「Call to a member function execute() on a non-object in」とエラーが出て止まってしまいます。 どこがおかしいでしょうか? mysqlはきちんと作動しています。(他のプログラムで試しました)
回答: テーブルのカラム作成時、log_idにAUTO_INCREMENTを付けてください。 ``` log_id INTEGER AUTO_INCREMENT PRIMARY KEY, /* ログID */ ``` エラーの意味は「オブジェクトではないのにexecute()メンバ関数を呼んだ」ということです。 なのでexecute()を探すと、 ``` $stmt->execute(array($_GET["name"],$_GET["body"], time())); ``` とありますね。これの$stmtがオブジェクトではないと言ってるわけです。で、$stmtは一つ前の ``` $stmt = $db->prepare($template); ``` で代入されています。で、prepare()がオブジェクトを返さない時があるかというと、マニュアルにエラー時FALSEを返す場合があるとあります。ということはここでエラーになっているのでしょう。 ということは$templateが怪しいということで見てみると、 ``` $template = "INSERT INTO chatlog (name,body,ctime)". "VALUES(?,?,?);"; ``` 一見良さそうに見えますが、テーブルのchatlogはと言うと、 ``` // チャットログのテーブル定義 $create_query = <<< ___SQL___ CREATE TABLE IF NOT EXISTS chatlog ( log_id INTEGER PRIMARY KEY, /* ログID */ name TEXT, /* 名前 */ body TEXT, /* 本文 */ ctime INTEGER /* 投稿日時 */ ); ___SQL___; $db->exec($create_query); ``` ここでもエラーチェックされていないのでエラーが発生している可能性、既に違うカラムの同名テーブルがある可能性とかありますが、よく見るとlog_idがPRIMARY KEYなのに INSERT INTOにありません。 sqliteではINTEGER PRIMARY KEYの場合、自動的にAUTOINCREMENT になるようなのでエラーになりませんが、mysqlでは明示しないとINSERT時にエラーになると思います。