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

PHP Mysql PDO antallet af bundne variabler svarer ikke til antallet af tokens

Det ser ud til, at Mark Baker allerede har besvaret dit spørgsmål, men jeg ville gerne tilføje et par tips, der har hjulpet mig meget.

PDO behøver ikke mysql_escape_string
Så længe alt, der går ind i din forespørgsel, der omhandler brugerinput, bruger en forberedt erklæring (som du er ovenfor), behøver du ikke undslippe input med mysql_real_escape_string [1].

// Don't worry about SQL injection since all of the user 
// defined inputs are being escaped by the PDO package
$sql = "INSERT INTO "
     .   "`users` "
     . "SET "
     .   "`name` = :name";

$query = $pdo->prepare($sql);
$query->bindParam(':name', $name);
$query->execute();

Men vær opmærksom på, at SQL-injektion stadig er mulig, hvis du ikke binder brugerinput:

// SQL injection can totally happen here
$sql = "INSERT INTO "
     .   "`users` "
     . "SET "
     .   "`name` = $name";

$query = $pdo->prepare($sql);
$query->execute();

[1] http://www.php.net/manual/ da/pdo.prepared-statements.php




Prøv at gøre din SQL så kort som muligt
For simple SQL-sætninger, jo kortere den er, jo lettere er den at vedligeholde, og du er mindre tilbøjelig til at lave fejl. Du kan bruge en alternativ INSERT-syntaks[2]:

INSERT INTO 
  `users`
SET
  `name` = 'Steve';

svarer til:

INSERT INTO 
  `users`
  (
    `name`
  )
  VALUES
  (
    'Steve'
  );

Det betyder, at for store udsagn som dine, kan du effektivt halvt dens størrelse, fordi du ikke behøver at gentage alle kolonnenavnene:

$sql  = "INSERT INTO "
      .   "`records_rec` "
      . "SET "
      .   "`oldid_rec`       = :oldid_rec, "
      .   "`firstname_rec`   = :firstname_rec, " 
      .   "`artist_rec`      = :artist_rec, " 
      .   "`aside_rec`       = :aside_rec, "
      .   "`bside_rec`       = :bside_rec, "
      .   "`label_rec`       = :label_rec, "
      .   "`condition_rec`   = :condition_rec, " 
      .   "`genere_rec`      = :genere_rec, "
      .   "`price_rec`       = :price_rec, "
      .   "`collection_rec`  = :collection_rec, "
      .   "`active_rec`      = :active_rec, "
      .   "`info_rec`        = :info_rec, "
      .   "`notes_rec`       = :notes_rec, "
      .   "`order_rec`       = :order_rec, "
      .   "`alabelimage_rec` = :alabelimage_rec, "
      .   "`blabelimage_rec` = :blabelimage_rec, "
      .   "`asound_rec`      = :asound_rec, "
      .   "`bsound_rec`      = :bsound_rec, "
      .   "`featured_rec`    = :featured_rec, "
      .   "`format_rec`      = :format_rec";

$dbh = new PDO(<info goes here>);
$stmt = $dbh->prepare($sql); 

// Bind your params here...

[2] http://dev.mysql.com/doc/ refman/5.5/da/insert.html




Gør dine SQL-sætninger multi-line og smukke

Jeg begyndte at formatere mine SQL-sætninger til at være multi-lined (som ovenfor), og lige siden har jeg haft MEGET færre fejl som denne. Det gør fylder meget, men jeg synes i sidste ende, at det er det værd. Ved at få alt til at stå på linje, får det fejl til at stikke ud som en øm tommelfinger.

God kodning!



  1. Mysql-datofunktionen virker ikke for mindre end

  2. Når mysql_query returnerer false

  3. GROUP BY og COUNT i PostgreSQL

  4. Opret en visning med ORDER BY-klausul