簡體   English   中英

在一個PHP函數中使用SQL SELECT然后進行UPDATE時出現問題-MYSQL PHP ST EXECUTE PDO

[英]Trouble Using SQL SELECT and then UPDATE in One PHP Function - MYSQL PHP ST EXECUTE PDO

更新:解決了,謝謝大家的幫助!


因此,我想擁有一個PHP函數,該函數查詢數據庫所有“ 出”類型的遭遇,然后以最近一次遭遇的日期來更新人員表字段lastCO

但是在我的UPDATE函數的while循環中似乎以某種方式出錯了。 您可以告訴我輸入了“ echo”語句,以便查看循環條件是否被滿足,實際上,當我查看源代碼時,它回響了一次

但是,當我注釋掉第二條(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語句和執行怎么了? 問題是在同一“連接”上同時連接到兩個不同表的方式嗎? 還有嗎

我只是在調試它時遇到了麻煩,而我可憐的回聲嘗試並沒有使我走遠:/

--

在此先感謝您的幫助!

請查看此手冊http://php.net/manual/zh/pdo.prepare.php ,它應該很清楚,

但是要在while循環內創建一個新的Persoon對象,而在之后不使用unset($ persoon)則是不好的內存管理。而且在循環內創建對象並不是很好,應該是一次又一次地重復使用相同的創建對象,再次像下面這樣

$person = new Person();

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

     person->populateFromArray($row)

替換為:

WHEN lastCO = null 

與:

WHEN lastCO is null 

變量和NULL值之間的比較必須使用IS NULL語句完成,否則始終為UNKNOWN,因此尚未執行您的THEN分支。

在您的查詢中,另一件事不適合我。

您使用CASE,但是如果lastCO不為null並且大於您的變量,則lastCO的值設置為NULL,因此您可以放置​​ELSE分支來防止此行為。

最后,您可以合並到僅一個不帶循環的UPDATE查詢中。

編輯評論的答案:

嘗試以下操作:在此查詢中,由於沒有放置where子句,因此更新了person表的所有記錄

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'

第三種:您有一個循環,您處理一個人的每一步。 因此,您可以使用where子句將更新限制為該人:person.id = $ person-> id或其他存儲了person ID的變量。

告訴我是否可以

$conn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);

在WHILE循環中運行無緩沖查詢時,無法執行某些操作。 添加以下行以確保正在使用緩沖的查詢。

編輯

當然,您需要在sql中使用where條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM