mysqli_query () ожидает как минимум 2 параметра & mysqli_query (): пустые сообщения об ошибках запроса

При запуске этого кода я получил 4 ошибки, которые добавляют адрес электронной почты пользователя в базу данных, называемую ecommerce в таблице subscriptions .

$ con = new mysqli ('localhost', 'root', '', 'ecommerce');

 if (!$con) { die('Could not connect: ' . mysql_error()); } $errors = array(); if($_POST) { if(empty($_POST['email'])) { $errors['email1'] = "<p style='color:red;font-family: BCompset, Arial, Helvetica, sans-serif;font-size:30px;float:right;'>Dont forget to write your email!</p>"; }else { $email = test_input($_POST["email"]); // check if e-mail address is well-formed if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors['email2'] = "<p style='color:red;font-family: BCompset, Arial, Helvetica, sans-serif;font-size:25px;float:right;'>Something wrong is with your email</p>"; }else{ // check if the email already exists $query = mysqli_query("SELECT * FROM subscriptions WHERE email='$email'"); if(mysqli_num_rows($query) > 0){ $errors['email3'] = "<p style='color:red;font-family: BCompset, Arial, Helvetica, sans-serif;font-size:25px;float:right;'>Your had been registered before!</p>"; } } } //check errors if(count($errors) == 0) { $insert_email = mysqli_query("INSERT INTO subscriptions (email) VALUES ('$email')"); $insert_email = mysqli_query($con, $insert_email); $success = "<script>alert('Your email was successfully added to our database!')</script>"; } } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?> <form action="" method="POST" class="searchform" dir="ltr"> <input type="text" name="email" placeholder="Your email address" value="<?php if(isset($_POST['email'])) echo $_POST['email']; ?>"/> <button name="submit" type="submit" class="btn btn-default"><i class="fa fa-arrow-circle-o-right"></i></button> <p><?php if(isset($errors['email1'])) echo $errors['email1']; ?></p> <p><?php if(isset($errors['email2'])) echo $errors['email2']; ?></p> <p><?php if(isset($errors['email3'])) echo $errors['email3']; ?></p> <p><?php if(isset($success)) echo $success; ?></p> <?php if(count($errors) == 0){echo "<p id='para' dir='rtl'>You can add your email to our emailsshow list.</p>";}?> </form> 

Ошибки таковы:

Предупреждение: mysqli_query () ожидает по крайней мере 2 параметра, 1 задано в строке 27

Строка 27:

$ query = mysqli_query ("SELECT * FROM subscriptions. Где адрес электронной почты = '$ email'");

Предупреждение: mysqli_num_rows () ожидает, что параметр 1 будет mysqli_result, null указан в строке 28

Строка 28:

if (mysqli_num_rows ($ query)> 0) {

Предупреждение: mysqli_query () ожидает как минимум 2 параметра, 1 задано в строке 37

Строка 37:

$ insert_email = mysqli_query ("INSERT INTO подписки (электронная почта) VALUES ('$ email')");

Предупреждение: mysqli_query (): пустой запрос в строке 38

Строка 38:

$ insert_email = mysqli_query ($ con, $ insert_email);

Я новичок на этом форуме, и было бы лучше, если бы вы могли помочь мне в этом, я действительно знаю, что делать … спасибо заранее!

Вместо

 $query = mysqli_query("SELECT * FROM subscriptions WHERE email='$email'"); 

использование

 $query = $con->query("SELECT * FROM subscriptions WHERE email='$email'"); 

или

 $query = mysqli_query($con, "SELECT * FROM subscriptions WHERE email='$email'"); 

Также вместо

 $insert_email = mysqli_query("INSERT INTO subscriptions (email) VALUES ('$email')"); 

использование

 $insert_email = $con->query("INSERT INTO subscriptions (email) VALUES ('$email')"); 

Это единственные 2 ошибки, которые я мог видеть.

В дополнение к отсутствующему ресурсу / объекту соединения 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 ...] } } 

Укажите свое соединение как параметр в вашей mysqli_query (), как это

 $query = mysqli_query($con,"SELECT * FROM subscriptions WHERE email='$email'"); 

Как только вы получите исправленный запрос, ошибка в mysqli_num_rows также должна исчезнуть.