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

mysqli_query() oczekuje co najmniej 2 parametrów &mysqli_query():Puste komunikaty o błędach zapytania

Oprócz brakującego zasobu/obiektu połączenia mysqli istnieją inne problemy ze skryptem:

  • jest podatny na wstrzyknięcia sql
  • nie testujesz połączenia mysql, jak pokazano na http://docs.php .net/mysqli.quickstart.connections
  • skrypt ogólnie nie obsługuje błędów. Każda z funkcji/metod mysqli_* może się nie powieść. Np. ostrzeżenie dotyczące mysqli_num_rows wiąże się z niesprawdzaniem wartości zwracanej przez mysqli_query .
  • Twoja funkcja test_input() niczego nie testuje, ale zmienia wartość; a adres e-mail nie ma nic wspólnego z htmlspecialchars() i in. Po prostu zrezygnuj z tej funkcji.
  • Weryfikacja adresu e-mail wydaje się zbyt skomplikowana bez oczywistych zasługa.
  • Zamiast kombinacji SELECT/INSERT, aby uniemożliwić dwukrotne wstawienie adresu e-mail, po prostu utwórz unikalny indeks na tym polu, a serwer mysql niezawodnie zapobiegnie duplikatom.

np.

<?php
define('MYSQL_ER_DUP_KEY', 1022); // see https://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html#error_er_dup_key
$errors = array();
if($_POST) // might be superfluous
{
    // simplified email validation
    // improve if needed
    $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
    if ( !$email ) {
        // removed html/style from error message, better do that when printing the error
        $errors['email1'] = "A valid email address is required";
    }

    // you only need the database connection after the email address is validated
    $mysqli = new mysqli('localhost', 'root', '','ecommerce');
    // see http://docs.php.net/mysqli.quickstart.connections
    if ($mysqli->connect_errno) {
        trigger_error("Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error, E_USER_ERROR);
    }

    // not checking if this email address is already in the database
    // instead create a unique index for that field
    // see https://dev.mysql.com/doc/refman/5.6/en/constraint-primary-key.html
    // - otherwise you'd at least have to lock the table to avoid race conditions -

    // sql injections: see http://docs.php.net/security.database.sql-injection
    // to prevent sql injections you either have to make sure string literals are
    // properly encoded/escaped or use preparead statements+parameters
    $stmt = $mysqli->prepare('INSERT INTO subscriptions (email) VALUES (?)');
    if ( !$stmt ) {
        trigger_error("prepare statement failed (" . $mysqli->errno . ") " . $mysqli->error, E_USER_ERROR);
    }
    else if ( !$stmt->bind_param('s', $email) ) {
        trigger_error("bind_param failed (" . $stmt->errno . ") " . $stmt->error, E_USER_ERROR);
    }
    else if ( !$stmt->execute() ) {
        // email has a unique index, inserting an email address a second time
        // results in a ER_DUP_KEY error
        if ( MYSQL_ER_DUP_KEY==$stmt->errno ) {
            $errors['email2'] = "email address already in subsription list";
        }
        else { // otherwise it's "really" an error
            trigger_error("execute failed (" . $stmt->errno . ") " . $stmt->error, E_USER_ERROR);
        }
    }
    else {
      [... inserted ...]
    }
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy istnieje wzór do oszacowania wielkości indeksu w InnoDB?

  2. Określ typ tabeli/silnik przechowywania w Doctrine 2

  3. Czy są jakieś negatywne skutki zmiany kodowania tabeli mysql?

  4. Migracja MySQL do PostgreSQL na AWS RDS, część 1

  5. python Wstaw MySQLDb z przygotowanymi instrukcjami