Mysql
 sql >> Database >  >> RDS >> Mysql

virgolette singole in SQL Query

mysql_real_escape_string() e sql injection sono già stati menzionati.
Ma in questo momento il tuo script (faticosamente) deve mescolare l'istruzione sql con i dati/parametri e nel passaggio successivo il server MySQL deve separare i dati dall'istruzione.
Utilizzando (lato server) dichiarazioni preparate entrambe le "parti" della tua query vengono inviate separatamente e il parser sql (del tuo server MySQL) non può mai essere "confuso" su dove finisce l'istruzione e iniziano i dati.

Il php-mysql il modulo non conosce le istruzioni preparate ma php-mysqli e DOP fare.

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

Può sembrare un sacco di rigonfiamenti se usi $stmt per una sola operazione. Ma considera che altrimenti devi chiamare mysql_real_escape_string() per ogni parametro.