2014-01-03 2 views
0

Я новичок в 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>'; 
    } 
+0

попробовать 'если ($ _POST) {var_dump ($ _ POST); // ... 'И добавить результат в вопрос – Paul

+0

Не имеет смысла завершение' print ''; 'inside' if ($ _ POST) ' – Paul

+0

@Paul" dghhd "[" checkbox "] => array (3) {[0] => string (2) "15" [1] => string (1) "8" [2] => string (2) "11"} ["textbox"] => array (15) { [0] => строка (7) "sfgsdfg" [1] => строка (7) "asdfasd" [2] => строка (8) "asdfdfas" [3] => строка (0) "" [4] => строка (0) "" [5] => строка (0) "" [6] => строка (0) "" [7] => строка (0) "" [8] => строка (0) "[9] => string (0)" "[10] => string (0)" "[11] => string (0)" "[12] => string (0)" "[13] = > string (0) "" [14] => string (0) ""} ["submit"] => string (3) "Добавить"} Ошибка: Дублировать запись '11 -14 'для ключа' PRIMARY ' – user3125917

ответ

0

Непроверенные значения не представлены и 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); 
} 
+0

это дает мне ошибку: Неопределенное смещение: 0; Неопределенное смещение: 0; Undefined offset: 1 Undefined offset: 3 в строке: $ query = "INSERT INTO $ movies (movieCode, title, dateOfIssue, категория, описание, изображение) VALUES ('". $ _POST [' moviecode ']. "', ' "$ _POST ['title']." ',' ". $ _POST ['dateofissue']." ',' ". $ _POST ['category']." ',' ". $ _POST ['desc' ]. "," ". $ _POST ['image1']." ') "; – user3125917

+0

@ user3125917 Отметьте обновленный ответ – Paul

+0

спасибо вам большое! Это помогло! – user3125917

0

использование mysql_escape_string($_POST['']) вместо каждого поля в $_POST[''] внутри mysqlquery.

+1

Don Не предлагайте использовать устаревшие. Используйте mysqli_ * – Paul

+0

@Paul да, вы правы. Я просто попытаюсь решить проблему. – Nambi

0

Как документированную под 17.2.1 Control types:

When a form is submitted, only "on" checkbox controls can become successful .

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

Таким образом, если все галочки не были проверены, массивы $_POST['checkbox'] и $_POST['textbox'] созданных PHP из формы представления будут содержать различное количество элементов — и, следовательно, те, с любым заданным индексом могут не совпадать.

Есть два способа решения этого:

  1. можно использовать client-sidescriptingto disablethe textbox, если соответствующий флажок снят: это предотвратит браузер от представления в текстовом поле и, соответственно, массивы в PHP (однако обратите внимание, что это решение зависит от при наличии клиентского сценария —, вам придется тестировать и обрабатывать случаи, когда такие скрипты недоступны); или

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

Вы также действительно должен прочитать на соответствующей строке отводящей (и как неспособность сделать это обнажает приложение как к ошибкам и часто эксплуатировали векторы атаки): Я очень рекомендую @deceze «s блог статьи, The Great Escapism (Or: What You Need To Know To Work With Text Within Text).

В частности, как он описывает в своей статье, вы должны убедиться, что вы избегаете любого HTML-кода в своих переменных перед передачей в браузер (чтобы предотвратить XSS attacks и ошибки, в которых текст, который будет выводиться, содержит символы, имеющие особое значение в 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 injection attack, но, кроме того, вносит ошибки, где строки содержат символы, которые имеют особое значение в пределах Строковые литералы SQL (например, ').

The solution является подготовить операторы SQL с заполнителей для параметров, которые получают subsituted с переменными После выполнения команды; это также обеспечивает повышение производительности, поскольку заявления должны быть получены только один раз, независимо от того, сколько раз, что они выполняются:

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>'; 
} 
+0

Спасибо вам большое! – user3125917

Смежные вопросы