Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Liczba powiązanych zmiennych PHP Mysql PDO nie odpowiada liczbie tokenów

Wygląda na to, że Mark Baker już odpowiedział na twoje pytanie, ale chciałem dodać kilka wskazówek, które bardzo mi pomogły.

PDO nie wymaga mysql_escape_string
Dopóki wszystko, co wchodzi w twoje zapytanie, które dotyczy danych wejściowych użytkownika, korzysta z przygotowanej instrukcji (tak jak powyżej), nie musisz zmieniać danych wejściowych za pomocą 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();

Pamiętaj jednak, że wstrzykiwanie SQL jest nadal możliwe, jeśli nie wiążesz danych wejściowych użytkownika:

// 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/ pl/pdo.prepared-statements.php




Spróbuj, aby Twój SQL był jak najkrótszy
W przypadku prostych instrukcji SQL im krótsze, tym łatwiejsze w utrzymaniu i mniejsze prawdopodobieństwo popełnienia błędów. Możesz użyć alternatywnej składni INSERT[2]:

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

jest równoważne z:

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

Oznacza to, że w przypadku dużych wypowiedzi, takich jak Twoje, możesz skutecznie połowę jego rozmiar, ponieważ nie trzeba powtarzać wszystkich nazw kolumn:

$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/pl/wstaw.html




Uczyń swoje wyrażenia SQL wielowierszowymi i ładnymi

Zacząłem formatować moje instrukcje SQL tak, aby były wielowierszowe (jak powyżej) i od tego czasu mam DUŻO mniej błędów takich jak ten. tak zajmują dużo miejsca, ale myślę, że w końcu warto. Układając wszystko w jednej linii, błędy wystają jak ból kciuka.

Miłego kodowania!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ruby On Rails działa wolno...?

  2. Problem z Pythonem:Nie można znaleźć vcvarsall.bat

  3. Jak utworzyć nowego użytkownika i przyznać uprawnienia w MySQL

  4. WYBIERZ wiersz według DATEPART()

  5. Perl DBI fetchall_hashref