JeffLiteral Ответов: 2

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


Два предупреждения показывают, но я едва ли могу указать, что сделало следующие коды ошибочными:
  1  <?php
  2  session_start();
  3  ?>
  4  <!DOCTYPE html>
  5      <head>
  6          <meta charset="UTF-8" />
  7          <!-- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">  -->
  8          <title>LRMS Login</title>
  9          <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
 10          <!--<link rel="shortcut icon" href="../favicon.ico">-->
 11          <link rel="stylesheet" type="text/css" href="css/login.css" />
 12  	<link rel="stylesheet" type="text/css" href="css/animate-custom.css" />
 13      </head>
 14      <body>
 15          <div class="container">
 16              <section>				
 17                  <div id="container_demo" >
 18                      <a class="hiddenanchor" id="toregister"></a>
 19                      <a class="hiddenanchor" id="tologin"></a>
 20                      <div id="wrapper">
 21                          <div id="login" class="animate form">
 22                              <form  action="filter.php" autocomplete="on" method="post"> 
 23                                  <h1>System Security</h1> 
 24                                  <p> 
 25                                      <label for="username" class="uname" data-icon="u" >Username </label>
 26                                      <input id="username" name="username" required="required" type="text" placeholder="John"/>
 27                                  </p>
 28                                  <p> 
 29                                      <label for="password" class="youpasswd" data-icon="p">Password </label>
 30                                      <input id="password" name="password" required="required" type="password" placeholder="secret01" /> 
 31                                  </p>
 32                                  <p class="keeplogin"> 
 33  									<input type="checkbox" name="loginkeeping" id="loginkeeping" value="loginkeeping" /> 
 34  									<label for="loginkeeping">Keep me logged in</label>
 35  								</p>
 36                                  <p class="login button"> 
 37                                      <input type="submit" value="Login" /> 
 38  								</p>
 39                                  <p class="change_link">
 40  									Not a member yet ?
 41  									<a href="#toregister" class="to_register">Register</a>
 42  								</p>
 43                              </form>
 44                          </div>
 45  
 46                          <div id="register" class="animate form">
 47                              <form  action="filter.php" autocomplete="on" method="post"> 
 48                                  <h1>Register Here</h1> 
 49                                  <p> 
 50                                      <label for="firstnamesignup" class="fname" data-icon="u">Your firstname</label>
 51                                      <input id="firstnamesignup" name="firstnamesignup" required="required" type="text" placeholder="Admin Firstname" />
 52                                  </p>
 53                                  <p> 
 54                                      <label for="lastnamesignup" class="lname" data-icon="u">Your lastname</label>
 55                                      <input id="lastnamesignup" name="lastnamesignup" required="required" type="text" placeholder="Admin Lastname" />
 56                                  </p>
 57                                  <p> 
 58                                      <label for="emailsignup" class="email" data-icon="e">Your email</label>
 59                                      <input id="emailsignup" name="emailsignup" required="required" type="email" placeholder="Admin Email Address" />
 60                                  </p>
 61                                  <p> 
 62                                      <label for="usernamesignup" class="uname" data-icon="u">Your username</label>
 63                                      <input id="usernamesignup" name="usernamesignup" required="required" type="text" placeholder="Admin Username" />
 64                                  </p>
 65                                  <p> 
 66                                      <label for="passwordsignup" class="youpasswd" data-icon="p">Your password </label>
 67                                      <input id="passwordsignup" name="passwordsignup" required="required" type="password" placeholder="Admin Password"/>
 68                                  </p>
 69                                  <p class="signin button"> 
 70  									<input type="submit" value="Sign up"/> 
 71  								</p>
 72                                  <p class="change_link">
 73  									Already a member ?
 74  									<a href="#tologin" class="to_register"> Go and log in </a>
 75  								</p>
 76                              </form>
 77                          </div>
 78  						
 79                      </div>
 80                  </div>  
 81              </section>
 82          </div>
 83          <?php
 84              include "db.php";
 85              
 86              function register($id,$uname,$pass,$fname,$lname,$email){
 87                  $q="insert into users values ('$id','$uname','$pass','$fname','$lname','$email')";
 88                  mysqli_query("alter table users auto_increment = 1");
 89                  if(mysqli_query($q)){
 90                      mkdir("$dir", 0700);
 91                      echo "<script language='javascript'>
 92  				alert('User Registered');
 93  				window.location = 'filter.php';
 94  				</script>
 95  				";
 96                      
 97                  }
 98                  else{
 99                       echo "<script language='javascript'>
100  				alert('Registration Failed Or User Already Registered');
101  				window.location = 'filter.php';
102  				</script>
103  				";
104                  }
105              }
106              if(isset($_POST['usernamesignup'])){
107                  $uname=$_POST['usernamesignup'];
108                  $pass=$_POST['passwordsignup'];
109                  $pass_crypt=md5($pass);
110  				$fname=$_POST['firstnamesignup'];
111  				$lname=$_POST['lastnamesignup'];
112  				$email=$_POST['emailsignup'];
113              
114                  register('',$uname,$pass_crypt,$fname,$lname,$email);
115              }
116              if(isset($_POST['username'])){
117                  include "db.php";
118                  $username=$_POST['username'];
119                  $password=$_POST['password'];
120                  $pass_crypt=md5($password);
121              
122                  $q ="SELECT * FROM users WHERE username = '$username' and password = '$pass_crypt'";
123                  $query=mysqli_query($config,$q);
124                  // Check username and password match
125                  if (mysqli_num_rows($query) == 1){
126                          // Set username session variable
127                          $_SESSION['username']=$_POST['username'];
128                          // Jump to secured page
129                          //header("Location: home.php");
130  						echo '<script type="text/javascript">
131  							location.replace("home.php");
132  							</script>';
133                  }
134                  else{
135                          echo "
136                          <script language='javascript'>
137                                  alert('Invalid Credentials');
138                          </script>
139                          ";
140                  }
141              }
142          ?>
143      </body>
144  </html>


Что я уже пробовал:

Ошибка возникает здесь:
 88  mysqli_query("alter table users auto_increment = 1");
 89  if(mysqli_query($q)){

Мне очень жаль. Я не знаю, как поставить номера строк (я не знаю, как это называется) :) .

Я не пробовал ничего подобного. Но если кто-нибудь здесь может поделиться, как решить эту проблему (Я думаю, что это довольно просто для вас) проблема, я был бы очень благодарен. Спасибо всем.

Richard Deeming

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

PHP: SQL-инъекция - руководство пользователя[^]
РНР: Подготовленные инструкции и хранимые процедуры - руководство пользователя[^]

Richard Deeming

Вы также храните несоленый MD5-хэш паролей ваших пользователей. Не делай этого. MD5 уже много десятилетий не считается "безопасным".

Используйте встроенные функции PHP,чтобы делать правильные вещи при хранении / проверке паролей:
PHP: password_hash[^]
РНР: функцию password_verify[^]

2 Ответов

Рейтинг:
12

OriginalGriff

Прочтите сообщение об ошибке:

mysqli_query() expects at least 2 parameters, 1 given in lines 88 and line 89
Теперь я понятия не имею, какие строки 88 и 89 - и я не собираюсь их считать, - но весь ваш метод доступа к БД ошибочен, и очень, очень вероятно, что именно такой код является причиной вашей проблемы:
$q="insert into users values ('$id','$uname','$pass','$fname','$lname','$email')";


Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Исправьте это на протяжении всего вашего приложения - и если вы пропустите его, кто - то его найдет-и проблема, которую вы заметили, скорее всего, исчезнет в то же время.


JeffLiteral

Я не знаю, как заполнить номера строк для каждой строки кодов. Мое извинение. Я новичок в этом мире php. Ничего не поделаешь, но это требование для этой новой нормальной атмосферы. Большая мощность.

OriginalGriff

Поэтому не сваливайте на нас весь код, покажите нам соответствующий фрагмент кода и укажите, о какой строке(строках) он говорит.

Рейтинг:
1

Member 14992792

Это в строке 89. функция mysqli_query() требует двух параметров - соединения и запроса. Пожалуйста, обратитесь к строке 123.

if (mysqli_query($connection, $query)){
...
}