2

トランザクションを使用して 2 つの異なるテーブルを更新しようとしています。最初のクエリで、「準備されたステートメントのパラメーターにデータが提供されていません」というエラーが表示されます。私の2番目のクエリはうまくいきます。エラーが $stmt->bind_param() に渡される変数を参照していることはわかっています。私はチェックし、トリプルチェックし、渡したすべての変数に実際に値が含まれていることを確認できました。また、渡される値が「s」または「i」で正しく示されていることも確認しました。私の質問は、このエラー メッセージを表示する構文エラーがありますか、またはそれを修正する方法について他に何か提案はありますか?

function updateClient($id,$first,$last,$email,$phone,$phoneCarrier,$tz,$wdh1,$wdh2,$weh1,$weh2,$goals){
global $conguest;
global $database;

$conguest->autocommit(false);  

//update the client tabel
$sql="UPDATE $database.client SET clientFirst = '?', clientLast = '?', clientEmail ='?', clientPhone =?, phoneCarrierId =?, timezoneId =?, clientHour1 ='?',clientHour2 ='?',clientHour3 ='?',clientHour4 ='?'
WHERE clientId = ?";

if($stmt = $conguest->prepare($sql)){        
    $stmt->bind_param('ssssiissssi', $first, $last, $email, $phone, $phoneCarrier, $tz, $wdh1, $wdh2, $weh1, $weh2, $id);
    $stmt->execute();        
    $clientupdate = $stmt->affected_rows;        
    $stmt->close();
}   
//update the goals table
$sql = "UPDATE $database.goal SET goalContent=?, categoryId = ?, goalDate=now() WHERE goalId = ?";

foreach ($goals as $goal) {
    if ($stmt = $conguest->prepare($sql)) {
        $stmt->bind_param('sii', $goal['goal'],$goal['cat'], $goal['id']);
        $stmt->execute();
        $i = $stmt->affected_rows;
        $stmt->close();
    }
    if($i){
        $goalupdate ++;
    }
}
//test that all updates worked
echo "$clientupdate, $goalupdate";
exit;
if($clientupdate ==1 && $goalupdate == 3){
    $conguest->commit();
    $conguest->autocommit(true);
    return 1;
}else{
    $conguest->rollback();
    $conguest->autocommit(true);
    return 0;
}    

}

4

1 に答える 1

1

プレースホルダーを囲む一重引用符を削除します。交換

$sql="UPDATE $database.client SET clientFirst = '?', clientLast = '?', clientEmail ='?', clientPhone =?, phoneCarrierId =?, timezoneId =?, clientHour1 ='?',clientHour2 ='?',clientHour3 ='?',clientHour4 ='?' WHERE clientId = ?";

$sql="UPDATE $database.client SET clientFirst = ?, clientLast = ?, clientEmail = ?, clientPhone = ?, phoneCarrierId = ?, timezoneId = ?, clientHour1 = ?, clientHour2 = ?,clientHour3 = ?,clientHour4 = ? WHERE clientId = ?";

さらに、「where clientid」の前に改行があります。これが関連しているかどうかはわかりません。

于 2012-11-24T22:53:06.470 に答える