我有文本框的数组变量如何才能正确使用$ _POST?

时间:2011-05-31 15:12:14

标签: php mysql

    注册     
    

<?php
session_start();
$connection=Mysql_connect('localhost','admin','123');
Mysql_select_db('db',$connection);
if(array_key_exists('insert',$_POST))
{
$query="select * from pharmacy";
$result=mysql_query($query);
if (!$result)
{
print(mysql_errno() .":". mysql_error());
}
$num=Mysql_num_rows($result);
$num1=Mysql_num_fields($result);
    if($num>0)
    {
    echo "<table border=2>";
    for($i=0;$i<$num;$i++)
    {
    $row=mysql_fetch_row($result);
    echo "<tr>";
    echo"<td><input type='Checkbox' name='p[$i]'  value='on' unchecked /></td>";
    echo"<td>$row[0]</td>";
    echo"<td><input type='txt' name='q[$i]' /></td>";
    $r[$i]=$row[0];
    if(isset($_POST['q']))
    $q[$i]=$_POST['q'];
    echo"</tr>";
    }//for
    echo"</table>";
    }
    if(isset($_POST['p']))
    foreach($_POST['p'] as $key=>$value)
        {
        if($value=="on")
        {
       $u=$_SESSION['t'];

       $query8="insert into $u(name,qun)values('$r[$key]',$q[$key])";
      echo $query8;
       $result8 = mysql_query($query8);
    //header("Location: show.php?");
    }
    echo $q[0];
       }//for

    }
?>
<input type="submit" name='insert' value="insert Drugs"/>
</form>
</body>

我有一个表有行,我在mysql的另一个表中插入所选的 但是,当我想插入文本的内容时,我有问题 我的问题在这里:if(isset($ _ POST ['q']))         $ Q [$ I] = $ _ POST [ 'Q']; 它无法设置我怎样才能纠正它?

3 个答案:

答案 0 :(得分:3)

此代码:

enter image description here 编码恐怖

$query8="insert into $u(name,qun)values('$r[$key]',$q[$key])";

注射噩梦!

从安全角度来看,这段代码存在很多错误:

  1. 始终使用$var = mysql_real_escape_string($_POST['var'');
  2. $vars单引号的查询中,始终围绕用于'
  3. 如果您使用动态数据库,表格或字段名称mysql_real_escape_string 将无法正常工作,也不会使用任何其他转义功能。
  4. 您需要根据预先批准的表格和字段名称列表检查所有表格名称和字段名称。
  5. 如果必须使用动态字段和/或列名,请使用```转义它们; 这不是为了安全,而是在使用保留字或数字作为列/表名时阻止查询中出现语法错误。
  6. 有关详细信息,请参阅此问题:How to prevent SQL injection with dynamic tablenames?

答案 1 :(得分:-1)

$_POST['q']是一个数组,因此您的$query8将在您使用时失败:

$q[$i]=$_POST['q'];

$q的所有值都是数组,您无法在数据库中插入数组,如下所示:

$query8="insert into $u(name,qun)values('$r[$key]',$q[$key])";

您可能需要以下内容:

$q[$i]=$_POST['q'][$i];

编辑顺便说一句,您始终需要准备数据以便在数据库中使用。我更喜欢预处理语句/ PDO但是如果你使用常规mysql,你需要在使用类似mysql_real_escape_string之类的内容之前转义变量。

编辑2:如果是可变的表名或列名,请始终针对白名单进行检查。

答案 2 :(得分:-1)

您确实应该将表单处理代码与表单生成代码分开。这种可怕的混合很难调试。

<?php

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (isset($_POST['p']) && is_array($_POST['p'])) {
        foreach($_POST['p'] as $key => $val) {
           ... do db stuff ...
        }
    }
}

... generate form here ...