我有一个表格,教练可以进入多个投手进行比赛。该表单允许用户根据需要添加行,如下所示:
<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 db中:
$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 - BUT - 而不是表单中的值 - 它放入零和数组标记,如下所示:
pitcherteam pitcher pitcherage pitches
Array[0] Array[0] 0 0
Array[1] Array[1] 0 0
Array[3] Array[3] 0 0
有关正在发生的事情的任何想法?谢谢!
答案 0 :(得分: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所述,处理这种情况的最佳方法是使用prepared statements。虽然根据您的经验,这可能需要一些额外的时间和精力才能将您的代码转换为该样式。
表格和字段名称也应该用反引号`
包围,以避免与保留关键字冲突
除了清理变量之外,您还可以很好地验证输入。其他专门的清洁方法也可用于数字字段调用intval
或floatval
,因为其他字符串修复方法是不必要的