0

更新: 解決しました。みんなの助けに感謝します!


したがって、「チェックアウト」タイプのすべての出会いについてデータベースにクエリを実行し、最新の出会いの日付でpersonテーブルフィールドlastCOを更新する PHP 関数が必要です。

しかし、私の UPDATE 関数の while ループでは、どういうわけかエラーが発生するようです。ループの条件が満たされているかどうかを確認できるように、「echo」ステートメントを挿入したことがわかります。実際、ソースを見ると、一度エコーしまし

しかし、2 番目の (UPDATE) SQL ステートメントをコメントアウトすると、while ループが適切に繰り返されているように見えます (そして、echo ステートメントが何度も何度も出力されます)。

  public static function getLastCO() {

    $conn = new PDO( DB, DBU, DBP );

    $sql = "SELECT UNIX_TIMESTAMP(encPastDate) AS encPastDate, encPastText,encPastPTRef
    FROM enctsPast WHERE encPastText = 'Check-out'";    
    $st = $conn->prepare( $sql );
    $st->execute();

    $row = $st->fetch();

       //trouble seems to start here!!!!

       while ( $row = $st->fetch() ) {

         $person = new Person( $row );

         if ($person->encPastDate != null){
            echo '123abc456';
            $sql1 = "UPDATE persons SET lastCO = 
             (CASE WHEN lastCO < '$person->encPastDate' THEN '$person->encPastDate'                      
             WHEN lastCO = null THEN '$person->encPastDate' END)";  
            $st = $conn->prepare( $sql1 );
            $st->execute();
        }
    }
    $conn = null;
  }      

では、UPDATE ステートメントと実行の何が問題なのですか? 問題は、同じ「接続」で 2 つの異なるテーブルに接続する方法ですか? 他の何か?

私はこれをデバッグするのに問題があります.

-

よろしくお願いします。

4

3 に答える 3

0

このマニュアルhttp://php.net/manual/en/pdo.prepare.phpを確認してください。

しかし、後で unset($persoon) を使用せずに while ループ内で新しい Persoon オブジェクトを作成するのは、メモリ管理が悪い..そして、ループ内でオブジェクトを作成することはあまり良くありません。再び以下のようなもの

$person = new Person();

while ( $row = $st->fetch() ) {

     person->populateFromArray($row)
于 2013-08-10T12:40:08.010 に答える
0

これを置き換えます:

WHEN lastCO = null 

と:

WHEN lastCO is null 

変数と NULL 値の比較は IS NULL ステートメントで行う必要があります。それ以外の場合は常に UNKNOWN であるため、THEN 分岐は実行されません。

あなたの質問で、私にとって正しくない別のことがあります。

CASE を使用しますが、lastCO が null ではなく、変数よりも大きい場合、lastCO の値は NULL に設定されるため、ELSE ブランチを配置してこの動作を防ぐことができます。

最後に、ループなしで 1 つの UPDATE クエリだけでクエリにマージできます。

コメントの回答について編集:

これを試してください: このクエリでは、where 句を入れていないため、persons テーブルのすべてのレコードを更新します。

UPDATE persons
SET lastCO = 
CASE 
    WHEN lastCO < '$person->encPastDate'
    THEN '$person->encPastDate'                      
    WHEN lastCO is null
    THEN '$person->encPastDate' 
    ELSE lastCO = lastCO
END

別の方法: この方法では、lastCO が評価されていないか、変数 '$person->encPastDate' より低い場合に、個人のレコードのみを更新します。

UPDATE persons
SET lastCO = 
CASE 
    WHEN lastCO < '$person->encPastDate'
    THEN '$person->encPastDate'                      
    WHEN lastCO is null
    THEN '$person->encPastDate' 
END
where lastCO is null or lastCO < '$person->encPastDate'

3 番目の方法: 人を処理するすべてのステップで、ループがあります。そのため、where 句で使用して、その人で更新を制限できます: persons.id = $person->id または個人 ID が保存されている他の変数。

大丈夫か教えて

于 2013-08-10T12:41:08.953 に答える
-1
$conn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);

バッファリングされていないクエリが WHILE ループで実行されている間は、何かを行うことができません。次の行を追加して、バッファリングされたクエリが使用されていることを確認します。

編集

もちろん、これを行うには、SQL に where 条件が必要です。

于 2013-08-10T12:42:33.383 に答える