Mysql
 sql >> база данни >  >> RDS >> Mysql

mysqli_query() очаква поне 2 параметъра &mysqli_query():Съобщения за грешка при празна заявка

В допълнение към липсващия ресурс/обект за връзка с mysqli има някои други проблеми със скрипта:

  • той е податлив на sql инжекции
  • не тествате mysql връзката, както е показано на http://docs.php .net/mysqli.quickstart.connections
  • скриптът като цяло няма обработка на грешки. Всяка от функциите/методите mysqli_* може да се провали. напр. предупреждението относно mysqli_num_rows е свързано с това, че не се проверява върнатата стойност на mysqli_query .
  • вашата функция test_input() не тества нищо, но променя стойността; и имейл адресът няма нищо общо с htmlspecialchars() и др. Просто зарежете тази функция.
  • проверката на имейл адреса изглежда прекалено сложна без очевидно заслуги.
  • Вместо комбинация SELECT/INSERT, за да попречите на имейл адрес да бъде вмъкнат два пъти, просто създайте уникален индекс в това поле и mysql сървърът надеждно ще предотврати дублиране.

напр.

<?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. PHP функцията работи само веднъж

  2. Комбинирайте стойностите на два реда в един

  3. WebSecurity.CreateAccount не работи за MySQL

  4. Точното значение на клаузата за външния ключ на MySQL „при ограничение за изтриване“.

  5. Как да получите позиция в ранга от @curRank