2012-01-09 6 views
1

PHPとmySQLを使用してSQLトランザクションに問題があります。ここに私の文は次のとおりです。Mysqliは、SQL文が有効であっても、エラーを通知する準備をしていますか?

START TRANSACTION; 
INSERT INTO listings (title, price, seller, description, time, featured) 
       VALUES (?, ?, ?, ?, ?, 0); 
SELECT @listingid:=LAST_INSERT_ID(); 
INSERT INTO pictures (listid, primarypic) 
       VALUES (@listingid, 1); 
COMMIT; 

この文は正常に動作している間、私は直接(マークに置き換えて?)のphpMyAdminを使用してそれを置くとき、私が

$stmt = $mysqli->prepare("statement"); 

を呼び出すときに「文」に置き換え失敗するようです上記の声明と一緒に。 $ stmtのbind_paramに到達する前に失敗するという事実は、それがパラメータに問題ではなく、むしろクエリであると信じています。それは場合に役立ちます。ここ

は、正確なエラーです:

あなたのSQL構文でエラーが発生しています。近くに使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルを確認してくださいラインで、あなたの助けを事前に2

感謝「を出品(タイトル、価格、販売者、説明、時間、特色)。INSERT INTO」 !

答えて

2

私はmysqliはそのような複合文を扱うことができるとは思わない(特に別のcommit()関数があるので)。最初にSTART TRANSACTION;の代わりにCOMMIT;最後に、クエリの前に$mysqli->autocommit(false);と完了すると$mysqli->commit();を実行します。

+2

+1また、[mysqli_prepare's docs](http://www.php.net/manual/en/mysqli.prepare.php)から:_ "クエリは単一のSQL文"_と_"注意:ステートメントに終わりのセミコロンや\ gを追加しないでください。 "_ – Wiseguy

+0

$ mysqli-> commit(); $ stmt-> execute()のあとに; ? –

+0

@Wiseguy良いキャッチ。どのように私はそれを逃したか分からない。私はストアドプロシージャを作成する必要がありますね。 –

1

問題は、ここで5つのSQL文を準備しようとしている、単一のSQL文だけを準備することができないということです。

ストアドプロシージャを作成するのが1つの方法です。 mysqli_prepare() documentationから

は、SQLクエリを準備し、文に操作するために使用するステートメントハンドルを返します。問合せは単一のSQL文で構成する必要があります。

関連する問題