0

クライアント側からJSONオブジェクトを受け取っています。これには、場所の属性がランダムな順序で含まれています。

アドレスのほぼ各コンポーネントの後に、または他のコンポーネントを前に付けることができます。例:州は、国の前または後に来る可能性があり、都市はその間のどこかにある可能性があります。

そこで、各パラメーターをそれが属する場所に動的にバインドする関数を作成しました。しかし、何らかの理由で、DBで取得できるのは、正と負の整数のガベージだけです。

生成されたクエリとバインドされた値をエコーすることによる単純なデバッグはあまり役に立ちませんでした。

たとえば、出力は次のとおりです(最初にクエリ、次に次の形式のバインドされたパラメータ:: param --- value):

    [1]UPDATE locations SET active = :active,locality = :locality,local_area = :local_area,state = :state,state_short = :state_short,country_full = :country_full,country_short = :country_short,postal_code = :postal_code,ya = :ya,za = :za WHERE location_id = 385
    Params:
    :active --- true:locality --- Moscow:local_area --- gorod Moskva:state --- Moscow
    :state_short --- Moscow:country_full --- Russia:country_short --- RU:postal_code --- 121069:ya --- 55.7427928:za --- 37.61540089999994

    [2]UPDATE locations SET active = :active,street_number = :street_number,route = :route,locality = :locality,sub_local_area = :sub_local_area,local_area = :local_area,state = :state,state_short = :state_short,country_full = :country_full,country_short = :country_short,ya = :ya,za = :za WHERE location_id = 386+++:active --- true:street_number --- 31:route --- Glategny Esplanade:locality --- St Peter Port:sub_local_area --- St Peter Port:local_area --- Guernsey:state --- Bailiwick of Guernsey:state_short --- Bailiwick of Guernsey:country_full --- Grosney:country_short --- GG:ya --- 49.461137:za

 --- -2.5333570000000236

コード:

function updateMultipile($table, $data = array()){

    $update_query = array();
    $i = 0;
    foreach($data as $key => $value){
        $sql = "UPDATE $table SET ";
            foreach($value as $column => $updatedValue){
                $sql .= $column . " = :" . $column . ",";
            }
            $sql = rtrim($sql, ", ");

        $sql .= " WHERE location_id = " . intval($key); 
        $update_query[$i] = $sql;
        $i++;
    }

    try{
        $conn = DBLink::getInstance();
        $j = 0;
        $success = 0;
        foreach($data as $fieldset => $value){
            echo('[1]');
            $sth = $conn->prepare($update_query[$j]);
            echo $update_query[$j] . "+++";
            foreach($value as $key => $myValue){
                $myKey = ':' . $key;
                $sth->bindValue($myKey, $myValue); //PDO::PARAM_STR);
                echo($myKey . " --- " . $myValue);
            }   
            if($sth->execute()){
                $success++;
            }
            else{
                echo $sth->errorCode();
            }

            $j++;
        }   
    }
    catch(PDOException $err){
        echo $err::getMessage;
    }   

    return $success;
}
4

2 に答える 2

2

Mysql は、複数の更新や複数のクエリをサポートしていません (私のデフォルト)。
これらの更新を個別に実行する必要があります

。すでに個別に実行していることがわかりました。コンピューターではなく、頭を使ってコードを実行するのは難しいことをご存知でしょう。

このコードの問題とは別に、データベース ラッパーを使用しない理由はありますか? コードを次のように単純にするには

function updateMultipile($table, $data = array())
{
    $db = DBLink::getInstance();
    foreach($data as $id => $update)
    {
        $sql = "UPDATE ?n SET ?u WHERE location_id = ?i";
        $db->query($table,$update,$id); 
    }
}
于 2013-01-29T09:58:21.067 に答える
0

とにかく、問題は、同じステートメントを数回実行しようとしていたこと、または値 ($myValue) が提供されたときに bindParam が foreach ループで機能しないことだったようです。これは、この関数が値ではなく参照を受け取るためです。

とにかく、この場合のニーズには bindValue で十分だと判断しました。

魅力のように機能します。

関数 updateMultipile($table, $data = array()){

    $update_query = array();
$i = 0;
    foreach($data as $key => $value){
        $sql = "UPDATE $table SET ";
            foreach($value as $column => $updatedValue){
                $sql .= $column . " = :" . $column . ",";
            }
            $sql = rtrim($sql, ", ");

        $sql .= " WHERE location_id = " . intval($key); 
        $update_query[$i] = $sql;
        $i++;
    }

try{
    $conn = DBLink::getInstance();
    $j = 0;
    $success = 0;
    foreach($data as $fieldset => $value){
        $sth[$j] = $conn->prepare($update_query[$j]);
        foreach($value as $key => $myValue){
            $myKey = ':' . $key;
            $sth[$j]->bindValue($myKey, $myValue); //PDO::PARAM_STR);

        }   
        if($sth[$j]->execute()){
            $success++;
        }
        else{
            echo $sth[$j]->errorCode();
        }

        $j++;
    }   
}
catch(PDOException $err){
    echo $err::getMessage();
}   

return $success;
}
于 2013-01-29T10:17:09.087 に答える