sql >> Databasteknik >  >> RDS >> Mysql

mysqli_query() förväntar sig minst 2 parametrar &mysqli_query():Tomma frågefelmeddelanden

Utöver den saknade mysqli-anslutningsresursen/objektet finns det några andra problem med skriptet:

  • den är benägen för sql-injektioner
  • du testar inte mysql-anslutningen som visas på http://docs.php .net/mysqli.quickstart.connections
  • skriptet i allmänhet saknar felhantering. Alla mysqli_*-funktioner/metoder kan misslyckas. T.ex. varningen angående mysqli_num_rows är relaterat till att inte kontrollera returvärdet för mysqli_query .
  • din funktion test_input() testar ingenting men ändrar värdet; och en e-postadress har ingenting att göra med htmlspecialchars() et al. Släpp bara den funktionen.
  • e-postadressvalideringen verkar alltför komplex utan att vara uppenbar meriter.
  • Istället för en SELECT/INSERT-kombination för att hindra en e-postadress från att infogas två gånger, skapa bara en unikt index på det fältet och mysql-servern kommer på ett tillförlitligt sätt att förhindra dubbletter.

t.ex.

<?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. MySQL beställer ett datumintervall till början och beställer sedan allt annat efter andra kriterier

  2. Räknar alla rader med specifika kolumner och grupperar efter vecka

  3. Jag försöker skapa en lagrad procedur för att skapa en inloggning och en databasanvändare?

  4. PostgreSQL nästa värde för sekvenserna?