Как разбирать массив в переменных (PHP)?

Для жизни я не могу заставить это работать. Я просмотрел много статей о stackoverflow, поэтому, если бы вы могли помочь, это было бы замечательно! Я работаю над отправкой формы для клиента. Они хотят иметь возможность выбирать несколько значений из раскрывающегося списка, которые, в свою очередь, я вытащу из базы данных, чтобы получить результаты запроса.

<form id="test" action="results.php" method="POST"> <select id="role" name="role[]" multiple> <option value="Student">Student</option> <option value="Faculty">Faculty</option> <option value="Alumni">Alumni</option> </select> <?php $query="SELECT City FROM Cities"; $result = mysqli_query($link, $query); echo '<select name="city" id="city" multiple>'; while($r = mysqli_fetch_assoc($result)){ echo '<option value="'.$r['City'].'">'.$r['City'].'</option>'; } ?> </select> <input type="submit"/> </form> 

//results.php

 $results=array(); $results[] = $_POST['role']; $results[]= $_POST['city']; echo "<pre>"; print_r($results); echo "</pre>"; 

** Как получить все значения из массива и проанализировать его на отдельные переменные, чтобы я мог использовать переменные в инструкции SQL? Вот мой вывод: **

 Array ( [0] => Array ( [0] => Faculty [1] => Alumni ) [2] => Adams ) 

Большое спасибо за любую помощь! 🙂 И если есть лучший способ сделать это, дайте мне знать.

[EDIT]: этот код является открытым для SQL-инъекции , пожалуйста, не используйте его.



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

Примечание 1-> Короче говоря, вы хотите запустить запрос, в соответствии с выбранными вами параметрами пользователем, убедитесь, что вы прочитали комментарий, чтобы понять логику, комментарии важнее кода,

Заметьте, что 2-> и многое другое я не понял, вы можете хранить свое значение в другой таблице, если это так, код немного изменится, но базовая оболочка останется прежней

Примечание 3-> Чтобы достичь результата, который вы хотите достичь, вам в основном нужно создать свой запрос в соответствии с установленными параметрами, а не использовать ключевое слово IN, и вы хорошо пойдете,

Примечание 4-> Я добавил echo statement, так что вы можете увидеть поэтапно, как разрабатывается наш запрос, я добавил комментарий, если вы хотите увидеть просто удалить комментарий, я не добавил комментарий в последнем эхом, чтобы вы могли видеть готовая к использованию строка запроса

Note Again-> one submit options, которые у меня уже есть, один из них создан мной, поэтому вы можете видеть, что происходит, и вы это сделаете для вас.

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

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

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

SideNote – еще одна вещь, которую я хочу сказать, причина, по которой это решение выглядит большим, связано с примечанием, формой и комментарием, если вы считаете строку кода php, с последним выражением эха, на самом деле это всего 10 строк php-кода , поэтому не бойтесь, потому что он выглядит большим

  <form id="test" action="" method="POST"> <select id="role" name="role[]" multiple> <option value="Student">Student</option> <option value="Faculty">Faculty</option> <option value="Alumni">Alumni</option> </select> <select id="city" name="city[]" multiple> <option value="London">London</option> <option value="Paris">Paris</option> <option value="New York">New York</option> </select> <input type="submit"> </form> <?php //creating variable and saying all the post request is equal to this variable $selected_options=$_POST; foreach($selected_options as $key=>$option){ $countValue = count($option); for($i=0; $i<$countValue; $i++){ /* * start adding the value seperated by coma, remember again it going to * be on extra coma so we have to remove it. */ $queryString_start_with_coma .= ",$option[$i]"; } /* * come out of loop, and now remove that extra coma */ $queryString_remove_extra_come= preg_replace("/,/", "", $queryString_start_with_coma, 1); /* * start building your query, use variable $key, just check the line below, * you will understand where and why i am using variable $key. */ $query_string_with_and .= " AND $key IN($queryString_remove_extra_come)"; /* * now unset the variable, this line is very important, so please also check * your out come without this line, * what i am simply doing is emptying the variable, if you dont * do it, it will add the value in the existing value, which i dont want, what * i want when the loop run for the second selected options, i want my variable * to be empty, so i can create new string * you will understand more if you remove this line and compare your two outcome * Note: you dont have to unset if you dont want to, but you have empty the * variable, you can also do by creating a empty string, do what ever you want * to do, just make sure the variable is empty for the second loop */ unset($queryString_start); } $query_string_second_part_ready = preg_replace("/AND/", "", $query_string_with_and, 1); //echo "$query_string_second_part_ready<br>"; $query_string= "SELECT * FROM table_name WHERE ".$query_string_second_part_ready; //see how your query look like echo $query_string; с  <form id="test" action="" method="POST"> <select id="role" name="role[]" multiple> <option value="Student">Student</option> <option value="Faculty">Faculty</option> <option value="Alumni">Alumni</option> </select> <select id="city" name="city[]" multiple> <option value="London">London</option> <option value="Paris">Paris</option> <option value="New York">New York</option> </select> <input type="submit"> </form> <?php //creating variable and saying all the post request is equal to this variable $selected_options=$_POST; foreach($selected_options as $key=>$option){ $countValue = count($option); for($i=0; $i<$countValue; $i++){ /* * start adding the value seperated by coma, remember again it going to * be on extra coma so we have to remove it. */ $queryString_start_with_coma .= ",$option[$i]"; } /* * come out of loop, and now remove that extra coma */ $queryString_remove_extra_come= preg_replace("/,/", "", $queryString_start_with_coma, 1); /* * start building your query, use variable $key, just check the line below, * you will understand where and why i am using variable $key. */ $query_string_with_and .= " AND $key IN($queryString_remove_extra_come)"; /* * now unset the variable, this line is very important, so please also check * your out come without this line, * what i am simply doing is emptying the variable, if you dont * do it, it will add the value in the existing value, which i dont want, what * i want when the loop run for the second selected options, i want my variable * to be empty, so i can create new string * you will understand more if you remove this line and compare your two outcome * Note: you dont have to unset if you dont want to, but you have empty the * variable, you can also do by creating a empty string, do what ever you want * to do, just make sure the variable is empty for the second loop */ unset($queryString_start); } $query_string_second_part_ready = preg_replace("/AND/", "", $query_string_with_and, 1); //echo "$query_string_second_part_ready<br>"; $query_string= "SELECT * FROM table_name WHERE ".$query_string_second_part_ready; //see how your query look like echo $query_string; 

Похоже, вы хотите создать запрос на основе данных, представленных пользователем. Это может быть немного сложнее, если у вас несколько таблиц, но основная идея состоит в том, чтобы использовать имена ввода с полями, собрать запрос из них, подготовить оператор и привязать параметры.

Назовите входы так же, как поля базы данных, которые они соответствуют

 // Identify which database fields can be searched // These names must match the names of the inputs // Each name has a type which will be used later $databaseFields = [ 'city' => 's', 'name' => 's', 'grade' => 'i' ]; $databaseFieldNames = array_keys($databaseFields); // Set up the beginning of the query $query = 'SELECT * FROM some_table WHERE '; // Initialize an array to use to store fields to be searched $where = []; // Loop through all the post data foreach ($_POST as $name => $value) { // If the name is in the database fields list, add it to the query if (in_array($name,$databaseFieldNames)) { $where[] = $name; } } // Add all the requested columns to the where if (!empty($where)) { $query .= ' '.$where[0].'=?'; array_pop($where); foreach ($where as $name) { if (is_array($_POST[$name])) { // Use any to check for multiple possible values $query .= ' AND '.$name.' = ANY (?)'; } else { $query .= ' AND '.$name.'=?'; } } } else { // Avoid an empty WHERE which will cause an error $query .= ' TRUE'; } $stmt = mysqli_prepare($query); /* Bind parameters */ foreach ($where as $name) { // $_POST should be validated here if (is_array($_POST[$name])) { // Arrays are imploded to work in an ANY $value = "'".implode("','",addslashes($_POST[$name]))."'"; } else { // Other values are used as sent $value = $_POST[$name]; } $type = $databaseFields[$name]; $stmt->bind_param($type,$value); } $stmt->execute();