Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

aspas simples na consulta SQL


mysql_real_escape_string() e injeções de SQL já foram mencionados.
Mas agora seu script (cuidadosamente) tem que misturar a instrução sql com os dados/parâmetros e na próxima etapa o servidor MySQL tem que separar os dados da instrução.
Usando (lado do servidor) declarações preparadas ambas as "partes" de sua consulta são enviadas separadamente e o analisador sql (do seu servidor MySQL) nunca pode ficar "confuso" sobre onde a instrução termina e os dados começam.

O php-mysql módulo não conhece instruções preparadas, mas php-mysqli e PDO Faz.
$pdo = new PDO('mysql:host=localhost;dbname=test', '...', '...'); 
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$stmt = $pdo->prepare('
  UPDATE
    Videos
  SET
    Title=:title ,
    Preacher=:preacher ,
    Date=:date ,
    Service=:service ,
    File=:file ,
    Description=:description
  WHERE
    id=:id
');
$stmt->bindParam(':title', $_POST['title']);
$stmt->bindParam(':preacher', $_POST['preacher']);
$stmt->bindParam(':date', $_POST['date']);
$stmt->bindParam(':service', $_POST['service']);
$stmt->bindParam(':file', $_POST['file']);
$stmt->bindParam(':description', $_POST['description']);
$stmt->bindParam(':id', $_GET['id']); // really _GET?
$stmt->execute();

Pode parecer muito inchado se você usar $stmt para apenas uma operação. Mas considere que, caso contrário, você terá que chamar mysql_real_escape_string() para cada parâmetro.