2011-08-10 13 views
0

PHPのMYSQL文でいくつかのパラメータをバインドする際に問題があります。下のマークされた行にcount($ posts)> 1を指定するとエラーになります。私が間違ったことを知っている人は誰ですか? エラーは次のとおりです。非オブジェクト上のメンバー関数bind_param()を呼び出します。また、同期していcommanを報告している?(下のマークされた行に)mysqli :: prepareはオブジェクトを返さないのですか?

<?php 

include '../../main/mainFunctions2.php'; 

$futurePosts = json_decode($_POST['futurePosts']); 

$repeatSerie = null; 
if(count($posts) > 1){ 

    //Get new repeatSeries 
    $stmt = $mysqli->prepare(" 
    SELECT repeatSerie 
    FROM timeSpaces_futurePosts 
    ORDER BY repeatSerie DESC 
    LIMIT 1 
    "); 
    $stmt->execute(); 
    $stmt->bind_result($repeatSerie); 
    $stmt->fetch(); 
    $repeatSerie = ((int)$repeatSerie + 1); 
} 
$timeStamp = time(); 
foreach($posts as $fp){ 
    $title = $fp->title; 
    $startDate = $fp->startDate; 
    $endDate = $fp->endDate; 
    $startTime = $fp->startTime; 
    $endTime = $fp->endTime; 
    $location = $fp->location; 
    $latLong = $fp->latLong; 
    $info = $fp->info; 
    $photoId = $fp->photoId; 
    $invited = $fp->invited; 
    if($invited != null){ 
     $invited = 1; 
    }else{ 
     $invited = 0; 
    } 
    $reminderType = $fp->reminderType; 
    $reminderTimeStamp = $fp->reminderTimeStamp; 
    $repeatSerie = $repeatSerie; 

    $stmt = $mysqli->prepare(" 
    INSERT INTO futurePosts (profileId, title, startDate, endDate, startTime, endTime, location, latLong, info, photoId, invited, reminderType, reminderTimeStamp, repeatSerie) 
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" 
    ); 
    $stmt->bind_param('isssiisssiisii', $profileId, $title, $startDate, $endDate, $startTime, $endTime, $location, $latLong, $info, $photoId, $invited, $reminderType, $reminderTimeStamp, $repeatSerie); 
    //The line above: Call to a member function bind_param() on a non-object 
    $stmt->execute(); 
    $futurePostId = $mysqli->insert_id; 

    if($invited == 1){ 
     foreach($fp->invited as $friendsId){ 
      $friendsId = $friendsId; 
      $stmt = $mysqli->prepare(' 
      INSERT INTO futurePosts_invited (profileId, futurePostId, timeStamp) 
      VALUES (?, ?, ?) 
      '); 
      $stmt->bind_param('iii', $friendsId, $futurePostId, $timeStamp); 
      $stmt->execute(); 
     } 
    } 
} 

echo 'TRUE'; 


?> 
+0

おそらく関連しています(私はSQLに間違いはありませんが、何か間違っている可能性があります):[PDOからエラーメッセージを取り出す方法](http://stackoverflow.com/ q/3726505) –

+0

コマンドが同期していません:今すぐprepareステートメントを使用することはできません。そのようなエラーは何ですか?私はそれをmysqli_report(MYSQLI_REPORT_ALL)で取得しました。同じ行に – einstein

+0

私はまた、エラーログ – einstein

答えて

3

$stmt = $mysqli->prepare(...);ラインが原因SQL構文エラーに失敗したため、これが最も可能性が高いです。 $mysqli->errorをエコーし​​て、何が問題なのかを確認してください。

SELECTステートメントの実行後、MySQLに他のクエリを発行する前に、$stmt->store_result();に電話してみてください。

サイドノート:foreachループの前に文を準備してください。ステートメントは一度しかコンパイルされず、各ループ実行時にパラメータのみがサーバーに送信されるため、少しのパフォーマンス向上が得られます。

+0

これは実際に問題を解決すると思います。つまり、mysqli文で 'close'を呼び出さずにforeach()ループ内で2回目の準備をしようとしています。その結果、 "out of synch"エラーが発生します。 – TML

+0

私はその@TMLについてはわかりません(つまり、そうではないと確信しています)。 '$ stmt'変数に2番目のステートメントを割り当てると、前のステートメントオブジェクトを逆参照し、オブジェクト破壊の一部として自動的に閉じます。 – Mchl

+0

あなたは正しいかもしれません - 私は実際にmysqlユーザの大部分ではありませんが、親mysqlオブジェクトはまだ開いている準備文を持っていることを知っており、結果を閉じる/閉じる必要があります。 「コマンドが同期していない」というエラーが表示されるのを止めてください。 – TML

0

mysqli_prepare()は文オブジェクトを返します。エラー が発生した場合はFALSEを返します。

関連する問題