簡體   English   中英

PDO MySQL php foreach循環

[英]PDO MySQL php foreach loop

我使用foreach循環更新單個mysql記錄,該循環獲取$ _POST變量的名稱和值,並同時更新記錄列,$ _ POST變量的名稱與mysql列名稱相同

這是代碼

foreach ($_POST as $key => $value)  {  
    $value = mysqli_real_escape_string($con, $value );  
    $value = strip_tags($value);  
    $sql="UPDATE properties SET $key = '$value' WHERE propertyID='$propertyID'";
    $query = mysqli_query($con, $sql);
    if (mysqli_errno($con)){$error=1;}
}//end foreach loop
unset($value);
unset($key);

這很好

但是我正在嘗試將循環轉換為使用PDO。 我曾嘗試查看有關此主題的先前帖子,但仍無法使其正常工作

這是我嘗試過的代碼:

foreach ($_POST as $key => $value) {  
    $value = mysqli_real_escape_string($con, $value );  
    $value = strip_tags($value);  
    $sql="UPDATE vendors SET $key = '$value' WHERE vendorID='$vendorID'";
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue($key, $value); //have also tried bindParam!!
    $stmt->execute();
}//end foreach loop
unset($value);
unset($key);

這會運行,但不會更新任何列,有人可以幫忙嗎?

謝謝

鮑勃

您沒有正確綁定值,請執行以下操作:

$sql="UPDATE vendors SET $key = :value WHERE vendorID='$vendorID'";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':value', $value); //have also tried bindParam!!

這就是我要做的:

foreach ($_POST as $key => $value) {  
    $query = 'UPDATE vendors SET ' . $key .' = :key WHERE vendorID=:vendorID';
    $statement = $pdo->prepare($query);
    $statement->execute(['key' => $key, 'vendorID' => $vendorID]);
}

但這並沒有優化,您正在逐一更新列。

看看這個線程,它說明了如何從數組中插入$ key和$ value,並使用它並將其放入您的SET語句中。

如何在PHP中不帶foreach的情況下使用鍵和值對數組進行內爆

作為一個更好的主意,您如何處理$ _POST 有點危險的問題,並構建一個查詢來更新一個查詢中所有提供的列。 它可以將數據庫服務器上的負載減少1000倍。

$columns = '';
foreach ( $_POST as $field_name=> $value ) {
    $columns .= "$field_name = ?,";
}
$columns = rtrim($columns, ',');  // loose the trailing comma

$sql="UPDATE vendors SET $columns WHERE vendorID=?";

$stmt = $stmt = $pdo->prepare($sql);
if ( ! $stmt ) {
    print_r( $pdo->errorInfo() );
    exit;
}

// add the parameter using the bindValue
$col = 1;
foreach ( $_POST as $idx => $value ) {
    $stmt->bindValue($col, $value);
    $col++;
}
$stmt->bindValue($col, $vendorID); // finally bind the vendorID

$res = $stmt->execute();
if ( ! $res ) {
    print_r( $stmt->errorInfo() );
    exit;
}

我很想知道這是否真的有效,因為我尚未對其進行測試。 如果是這樣,您將可能能夠聽到您的數據庫服務器發出可口的喘息聲。

問題是您要綁定值,但不發送任何參數查詢,只需刪除該行即可:

$stmt->bindValue($key, $value);

然后代碼將是:

foreach ($_POST as $key => $value) {  
$value = mysqli_real_escape_string($con, $value );  
$value = strip_tags($value);  
$sql="UPDATE vendors SET $key = '$value' WHERE vendorID='$vendorID'";
$stmt = $pdo->prepare($sql);
$stmt->execute(); 
}  //end foreach loop
unset($value);
unset($key);

將參數放在查詢中的另一種方法雖然更安全,但需要更多的工作和專業知識。

暫無
暫無

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

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