Correct way to perform a dynamic UPDATE with PHP in MySQL

4

What is the right way to do% dynamic%?

The big problem is to be dynamic, if I pass only the first parameter and others do not change.

What is the best way to leave this update only with the parameter I am changing without the need to pass the other set's.

$sqlupdate = " UPDATE eventos ? , ? , ?   WHERE num_codigo_pk = ?";
$sth = $db->prepare($sqlupdate);
$sth->bindValue(1 ,$_POST["nome_evento"], PDO::PARAM_STR);
$sth->bindValue(2 ,$_POST["cod_tipo_evento"], PDO::PARAM_INT);
$sth->bindValue(3 ,$_POST["cod_municipio_evento"], PDO::PARAM_INT);
$sth->bindValue(4 ,$_POST["num_codigo_pk "], PDO::PARAM_INT);
$sth->execute();
    
asked by anonymous 09.10.2014 / 00:32

2 answers

6

You can only indicate values and never SQL commands, which includes fields; Example of how you could do your query:

$sqlupdate = " UPDATE eventos SET nome = ? , cod_tipo_evento = ? , cod_municipio_evento = ? WHERE num_codigo_pk = ?";
$sth = $db->prepare($sqlupdate);
$sth->bindValue(1 ,$_POST["nome_evento"], PDO::PARAM_STR);
$sth->bindValue(2 ,$_POST["cod_tipo_evento"], PDO::PARAM_INT);
$sth->bindValue(3 ,$_POST["cod_municipio_evento"], PDO::PARAM_INT);
$sth->bindValue(4 , $_POST["num_codigo_pk "], PDO::PARAM_INT);
$sth->execute();

I also recommend doing some validation on the dandos before inserting them directly; For example:

$codEvento = intval($_POST["cod_tipo_evento"]);
// Ou validar algo para ver se nao esta vazio
$nomEvento = isset($_POST["nome_evento"]) ? $_POST["nome_evento"] : '';

To have all fields dynamically:

$campos = array();
if (isset($_POST["nome_evento"])) {
  $campos[] = 'nome';
}

if (isset($_POST["cod_tipo_evento"])){
  $campos[] = 'cod_tipo_evento';
}


if (isset($_POST["cod_municipio_evento"])){
  $campos[] = 'cod_municipio_evento';
}

if(count($campos) == 0) {
  die('Nao foi selecionado nenhum campo para atualizar!');
}

$sql = 'UPDATE eventos SET ';
$sql .= implode(" = ?,", $campos);

$sql .= ' = ? WHERE num_codigo_pk = ?';

In this way you generate the UPDATE only of the fields that came from the POST;

    
09.10.2014 / 01:28
3

First and foremost, always ensure data validation . I made a simple example that may be useful for you to set up your own mini ORM.

Basically it will combine the received data with the types defined to mount the SQL statement, combining the received data with typing: nome = str , cod_tipo_evento = int ...

QUERY : UPDATE table SET nome = ?, cod_tipo_evento = ?, cod_municipio_evento = ?, num_codigo_pk = ? WHERE num_codigo_pk = ?

The back loop assembles the bindValue with the types of each field and executes.

// data: valores recebidos via form
// type: definindo os tipos
$data = array( 'nome' => 'Papa' , 'cod_tipo_evento' => '1234' , 'cod_municipio_evento' => '4321' , 'num_codigo_pk' => '1' );
$type = array( PDO::PARAM_STR , PDO::PARAM_INT , PDO::PARAM_INT , PDO::PARAM_INT , PDO::PARAM_INT );

foreach( $data as $key => $val )
{
    $cols[] = "$key = ?";
    $vals[] = "$val";
}

// instrução update
$sth = $db->prepare('UPDATE 'table' SET ' . implode(', ', $cols) . ' WHERE num_codigo_pk = ?');

// loop nos valores para combinar os tipos
foreach( $vals as $i => $val )
    $sth->bindValue( ($i+1) , $val , $type[$i] );

$sth->execute();
    
09.10.2014 / 03:04