Я новичок в PHP. У меня проблема. Идея состоит в том, что я должен назначить актеров для выбранного фильма и добавить роль для каждого. Мне нужно выбрать несколько значений из списка и добавить описание для каждого через текс-поля. Мой код добавляет все проверенные значения в базу данных, но это создает беспорядок со значениями из текстовых полей, проверенные значения не соответствуют описанию. Я был бы очень благодарен за вашу помощь! Мой код: Форма:
<?php $sqlquery = "SELECT artistId, firstname, lastname from $artists order by 2"; $result = mysqli_query($connect, $sqlquery); if($result) { echo "<table class=\"addactor\">"; echo "<tr> <td id=\"text\" colspan=\"2\"><h3>Assign an actor to the movie</h3></td> </tr>"; while($sqlRow = mysqli_fetch_array($result, MYSQL_ASSOC)) { echo "<tr>"; echo "<td>"; echo "<input type=\"checkbox\" name=\"checkbox[]\" value=\"" . $sqlRow['artistId'] . "\"/> " . $sqlRow['firstname'] . " " . $sqlRow['lastname'] . "</td><td><input type=\"text\" name=\"textbox[]\"/></td>"; echo "</tr>"; } echo "<tr><td align=\"right\"><input type=\"submit\" name=\"submit\" id=\"submit\" value=\"Add\"></td><td><input type=\"reset\" name=\"reset\" id=\"reset\" value=\"Reset\"></td></tr></table>;"; } print '</table>';
Соединение с базой данных находится в другом файле, который включен здесь.
Вторая часть:
if($_POST) { $checkbox = $_POST['checkbox']; $txt = $_POST['textbox']; $len = sizeof($checkbox); for($i = 0; $i < $len; $i++) { $sqlqr = "INSERT INTO $role (artistId, movieCode, Description) VALUES ('" . $checkbox[$i] . "', '" . $_POST['moviecode'] . "', '" . $txt[$i] . "')"; mysqli_query($connect, $sqlqr); } $query = "INSERT INTO $movies(movieCode, title, dateOfIssue,category, description, image) VALUES ('" . $_POST['moviecode'] . "', '" . $_POST['title'] . "', '" . $_POST['dateofissue'] . "','" . $_POST['category'] . "', '" . $_POST['desc'] . "', '" . $_POST['image1'] . "')"; mysqli_query($connect, $query); if(mysqli_query($connect, $query) || mysqli_query($connect, $sqlqr)) { echo "<h4>1 record added</h4>"; } else { die('Error: ' . mysqli_error($connect)); } print '</form>'; }
Непроверенные значения не отправляются, а количество checkbox
не совпадает с textbox
. Вам следует указать одинаковые ключи массива ввода:
$i = 0; while($sqlRow = mysqli_fetch_array($result, MYSQL_ASSOC)) { echo "<tr>"; echo "<td>"; echo "<input type=\"checkbox\" name=\"checkbox[".$i."]\" value=\"" . $sqlRow['artistId'] . "\"/> " . $sqlRow['firstname'] . " " . $sqlRow['lastname'] . "</td><td><input type=\"text\" name=\"textbox[".$i."]\"/></td>"; echo "</tr>"; $i++; }
Используйте также этот код:
$checkbox = $_POST['checkbox']; $txt = $_POST['textbox']; foreach ($checkbox as $key => $value) $sqlqr = "INSERT INTO $role (artistId, movieCode, Description) VALUES ('" . $value . "', '" . $_POST['moviecode'] . "', '" . $txt[$key] . "')"; mysqli_query($connect, $sqlqr); }
используйте mysql_escape_string($_POST[''])
вместо каждого поля $_POST['']
внутри mysqlquery.
Как описано в разделе 17.2.1 Типы контроля :
Когда форма отправляется, могут быть успешными только контрольные элементы «on».
Другими словами, браузер будет отправлять только те флажки, которые были «отмечены», но будут отправлять каждый элемент управления текстовым полем независимо от статуса элемента управления флажком, с которым вы его связывали.
Поэтому, если все контрольные элементы флажка не были проверены, массивы $_POST['checkbox']
и $_POST['textbox']
созданные PHP из представления формы, будут содержать разные количества элементов – и, следовательно, те, у кого есть какой-либо данный индекс, могут не соответствует.
Существует два способа решения этого вопроса:
можно использовать скрипты на стороне клиента, чтобы отключить текстовое поле, если соответствующий флажок не установлен: это предотвратит отправку браузером текстового поля, и, соответственно, массивы в PHP будут снова выровнены (однако обратите внимание, что это решение зависит от доступности клиентский скрипт – вам придется тестировать и обрабатывать случаи, когда такие скрипты недоступны); или
можно дать явным указателям управления, чтобы они всегда были выровнены.
Вы также должны прочитать о правильном стирании строки (и о том, как неспособность сделать это подвергает ваше приложение как ошибкам, так и часто используемым атакам): я настоятельно рекомендую статью блога @ deceze « Великий эскапизм» (или: что вам нужно Знать, чтобы работать с текстом внутри текста) .
В частности, как он описывает в своей статье, вы должны убедиться, что вы избегаете любого HTML-кода в своих переменных перед передачей в браузер (во избежание атак XSS и ошибок, когда текст, который будет выводиться, содержит символы, которые имеют особое значение в HTML, например <
):
$result = mysqli_query($connect, " SELECT artistId, CONCAT(firstname, ' ', lastname) AS fullname FROM $artists ORDER BY firstname "); if ($result) { echo ' <table class="addactor"> <tr> <td id="text" colspan="2"><h3>Assign an actor to the movie</h3></td> </tr>'; $i = 0; while ($sqlRow = mysqli_fetch_array($result, MYSQL_ASSOC)) { echo ' <tr> <td> <input type="checkbox" name="checkbox[',$i,']" value="', htmlentities($sqlRow['artistId']), '" />', htmlentities($sqlRow['fullname']), ' </td><td> <input type="text" name="textbox[',$i,']"/> </td> </tr>'; $i++; } echo ' <tr> <td align="right"> <input type="submit" name="submit" id="submit" value="Add"> </td><td> <input type="reset" name="reset" id="reset" value="Reset"> </td> </tr> </table>'; }
Кроме того, объединение ненастроенных строк, предоставляемых пользователем непосредственно в ваш SQL, не только делает вас уязвимыми для атаки SQL-инъекций , но также вводит ошибки, в которых строки содержат символы, имеющие особое значение в строковых литералах SQL (например, '
)».
Решение состоит в том, чтобы подготовить SQL-запросы с заполнителями для параметров, которые будут заменены вашими переменными при выполнении команды; это также обеспечивает повышение производительности, так как инструкции нужно подготовить только один раз независимо от того, сколько раз они выполняются:
if ($_POST) { $stmt = mysqli_prepare($connect, " INSERT INTO $movies (movieCode, title, dateOfIssue, category, description, image) VALUES (?, ?, ?, ?, ?, ?) "); mysqli_stmt_bind_param($stmt, 'ssssss', $_POST['moviecode'], $_POST['title'], $_POST['dateofissue'], $_POST['category'], $_POST['desc'], $_POST['image1'] ); mysqli_execute($stmt) or die('Error: ' . mysqli_error($connect)); $stmt = mysqli_prepare($connect, " INSERT INTO $role (artistId, movieCode, Description) VALUES (?, ?, ?) "); mysqli_stmt_bind_param($stmt, 'sss', $checkbox, $_POST['moviecode'], $description ); foreach ($_POST['checkbox'] as $i => $checkbox) { $description = $_POST['textbox' ][$i]; mysqli_execute($stmt) or die('Error: ' . mysqli_error($connect)); } echo '<h4>1 record added</h4></form>'; }