2015-08-06 3 views
0

I ОБНОВЛЕНИЕ одной записи mysql с использованием цикла foreach, который получает имя и значение переменной $ _POST и UPDATES столбца записи в то время, имена переменных $ _POST такие же, как mysql имена столбцовPDO MySQL php foreach loop

Вот код

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); 

Это работает, но не обновляет любой из колонок, может кто-нибудь поможет пожалуйста?

Thanx

Боб

+0

Есть ли ошибки? Включено ли сообщение об ошибках? – Script47

+1

Действительно ли, вы обновляете одну и ту же таблицу ОДИН КОЛОНК В ВРЕМЯ ДЛЯ МНОЖЕСТВЕННЫХ КОЛОНК. «Вы не можете быть серьезным». Когда вы пересматриваете этот беспорядок, *** старайтесь реорганизовать свою основную концепцию в то же время *** – RiggsFolly

+0

Возможный дубликат [PHP: цикл while не работает после настройки SELECT для предотвращения SQL-инъекций] (http : //stackoverflow.com/questions/30979758/php-while-loop-not-working-after-adjusting-select-for-sql-injection-prevention) –

ответ

0

Вы не являются обязательными значение правильно, сделай это так:

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

Вот как я это сделаю:

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.

How to implode array with key and value without foreach in PHP

0

Как об этом, как лучшая идея, вы обрабатываете бит $ _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; 
} 

Я хотел бы знать, действительно ли это работает, поскольку я не тестировал его. Если это произойдет, вы, вероятно, сможете услышать, как ваш сервер базы данных слышит звуки облегчения.

0

Проблема заключается в том, что вы связывание значения, но не отправить любой запрос параметров просто удалить эту строку:

$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); 

один другой вариант поместите параметр в запрос, который более защищен, но ему нужна больше работы и опыта.