2017-04-18 69 views
1

嘗試插入來自在PHP中動態生成的表單的信息時遇到問題。 表格由可變數量的輸入組成,全部由四個輸入元素組成。請參見下面是如何產生自己的狀態:從多個選中的複選框和輸入到mySQL中的文本輸入插入PHP數組

<?php $result = mysql_query("SELECT id,name,description FROM todo_q WHERE todo_id = $todo_id AND active = 'y'"); 
       while($todo_q=mysql_fetch_array($result)){ 

               echo '<label>'; 
               echo $todo_q['name']; 
               echo '</label><br>'; 

               echo '<input type="checkbox" name="value[]" value="y" />'; 
               //echo '<input type="hidden" name="value[]" value="n" />'; 

               echo '<label>'; 
               echo $todo_q['description']; 
               echo '</label><br>'; 
               echo '<input type="text" id="comment" name="comment[]">'; 

               echo '<input type="hidden" name="user_id[]" value="'; 
               echo $user_id; 
               echo '" />'; 
               echo '<input type="hidden" name="todo_id[]" value="'; 
               echo $todo_q['id']; 
               echo '" />'; 
               echo '<HR>'; 

               }?> 

這是我嘗試插入信息到MySQL:

$query = "INSERT INTO todo_a (value, comment, user_id, todo_id) VALUES "; 
$query_parts = array(); 
for($x=0; $x<count($_POST["value"]); $x++){ 
    $query_parts[] = "('" . $_POST['value'][$x] . "','" . $_POST['comment'][$x] . "'," . $_POST['user_id'][$x] . "," . $_POST['todo_id'][$x] . ")"; 


    } 
    $q_parts = $query_parts; 

     foreach ($q_parts as $q_p){ 

      $insert = ($query .= implode(',', $query_parts)); 
      $result = mysql_query($insert); 
     } 

我的問題是,當檢查所有的複選框和評論的一切插入在數據庫的右側,但如果我跳過檢查一個複選框,然後它會搞砸了......

我想插入一個新的行,如果它的複選框被選中和/或輸入評論。 任何人都可以指向正確的方向嗎?

我試圖把一個隱藏的輸入來獲取未經檢查的複選框的值,但我似乎並沒有工作..這就是爲什麼我已經註釋掉隱藏的複選框。

PS。我知道我應該使用mysqli的,但這是一個較舊的網站,我沒有升級尚未..

+2

**強制警告:請請不要在生產中使用此代碼.. **。消毒您的查詢,以防止一些XSS ..還有你檢查了這個相關的問題? http://stackoverflow.com/questions/5640298/php-insert-data-from-checkbox-array-into-mysql?rq=1 – Pogrindis

+2

僅供參考,[你不應該在新代碼中使用'mysql_ *'函數]( http://stackoverflow.com/questions/12859942/)。他們不再被維護[並被正式棄用](https://wiki.php.net/rfc/mysql_deprecation)。看到[紅盒](http://php.net/manual/en/function.mysql-connect.php)?學習[*準備的語句*](https://en.wikipedia.org/wiki/Prepared_statement),並使用[PDO](http://php.net/pdo)或[MySQLi](http:// php.net/mysqli) - [這篇文章](http://php.net/manual/en/mysqlinfo.api.choosing.php)將幫助你決定哪一個最適合你。 –

+1

你的腳本存在[SQL注入攻擊]的風險(http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php)看看發生了什麼事[Little鮑比表](http://bobby-tables.com/)即使[如果你逃避投入,它不安全!](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around -mysql-real-escape-string)使用[prepared parameterized statements](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)。 –

回答

1

您需要添加索引輸入複選框,並發表評論名稱,如:

$cbIndex = 0; 
while($todo_q=mysql_fetch_array($result)){ 
    echo '<label>'; 
    echo $todo_q['name']; 
    echo '</label><br>'; 
    // Generate checkbox with index of current result 
    echo '<input type="checkbox" name="value[' . $cbIndex . ']" value="y" />'; 
    // Generate comment with index of current result 
    echo '<input type="text" id="comment" name="comment[' . $cbIndex . ']">'; 
    echo '<input type="hidden" name="user_id[' . $cbIndex . ']" value="'; 
    echo $user_id; 
    echo '" />'; 
    echo '<input type="hidden" name="todo_id[' . $cbIndex . ']" value="'; 
    echo $todo_q['id']; 
    echo '" />'; 
    echo '<HR>'; 
    // Inc of index 
    $cbIndex++; 
} 

當您提交您的形式,只有選中的複選框會出現在$ _ POST [「值」]:

foreach ($_POST["value"] as $cbIndex => $cbValue) { 
    $query_parts[] = "('" . $_POST['value'][$cbIndex] . "','" . $_POST['comment'][$cbIndex] . "'," . $_POST['user_id'][$cbIndex] . "," . $_POST['todo_id'][$cbIndex] . ")"; 
    // or 
    $query_parts[] = "('" . $cbValue . "','" . $_POST['comment'][$cbIndex] . "'," . $_POST['user_id'][$cbIndex] . "," . $_POST['todo_id'][$cbIndex] . ")"; 
} 
... 

順便說一句,你不需要複選框的儲值,那將是「Y」的所有時間。

信息這將是罰款,一個測試應用程序,而是由@Pogrindis和@約翰孔德的評論,這不是安全的代碼。 MySQLi/PDO +準備語句將避免SQL注入。

+1

謝謝@camille您的建議。它似乎工作。我不會在「實時」應用程序中使用它。現在這只是一個測試。 – user2533103

+0

完美!很高興幫助你:-D – Camille

相關問題