0

我有一个表格,教练可以输入多个投手进行比赛。该表单允许用户根据需要添加行,如下所示:

<tr><td><select name="pitcherteam[]" size="1">
<option>PLEASE SELECT TEAM
<option>Team 1
<option>Team 2
<option>Team 3
</select></td><td>
<input type=text size=50 name="pitcher[]"></td><td>
<select name="pitcherage[]" size="1">
<option>AGE
<option>8
<option>9
</select></td>
<td><input type="text" size=3 name="pitcherpitches[]"></td></tr>

我正在使用的 php 代码循环通过投手,如果它们不是空白,则插入 mysql 数据库:

$size_array = count($_POST['pitcher']); 
for ($i=0; $i<$size_array; $i++){ 
    if($_POST['pitcher'][$i] != ''){
    $sql2="INSERT INTO pitchcounts (pitcherteam, pitcher, pitcherage, pitches)
VALUES
    ('$_POST[date]','$_POST[pitcherteam][$i]','$_POST[pitcher][$i]','
$_POST[pitcherage][$i]','$_POST[pitches][$i]')";

    if (!mysqli_query($con,$sql2))
      {
  die('Error: ' . mysqli_error($con));
  }
} 
}

循环实际上是在更新 db - 但是 - 而不是表单中的值 - 它放入零和数组标记,如下所示:

pitcherteam pitcher pitcherage  pitches
Array[0]    Array[0]    0   0
Array[1]    Array[1]    0   0
Array[3]    Array[3]    0   0

关于发生了什么的任何想法?谢谢!

4

1 回答 1

3

连接你的字符串和变量!

$date = trim(mysqli_real_escape_string($_POST['date'])); //example variable clean
$sql2=" INSERT INTO
            `pitchcounts`
            (`pitcherteam`, `pitcher`, `pitcherage`, `pitches`)
        VALUES
            ('".$date."','".$_POST['pitcherteam'][$i]."','".$_POST['pitcher'][$i]."'
            ,'".$_POST['pitcherage'][$i]."','".$_POST['pitches'][$i]."')";

您还应该清理您的输入- 您永远不应该将$_POST数据直接放入数据库。

在处理清理数组时,无需循环遍历每个值分别应用清理方法,对于这些情况,您可以使用array_map

function clean($val)
{
     return trim(strip_tags(mysqli_real_escape_string($val)));
}
$pitchers = array_map('clean',$_POST['pitcher']);

但是,正如 HamZa 在下面提到的,处理此类情况的最佳方法是使用准备好的语句。尽管根据您的经验,这可能需要一些额外的时间和精力才能将您的代码转换为该样式。

表名和字段名也应该用反引号括`起来,以避免与保留关键字冲突

除了清理变量之外,您还可以很好地验证输入。也可以使用其他专门的清理方法,例如,对于数字字段调用intvalfloatval,因为其他字符串修复方法是不必要的

于 2013-07-30T13:12:59.617 回答