我是PHP的初学者。我遇到了问题。我的想法是,我必须将演员分配给选定的电影,并为每个电影添加一个角色。我需要从列表中选择几个值,并为每个via texfields添加一个描述。我的代码将所有选中的值添加到数据库中,但它使文本字段中的值变得混乱,选中的值与描述不匹配。我非常感谢你的帮助! 我的代码: 表格:
<?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 :(得分:1)
未提交未经检查的值且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);
}
答案 1 :(得分:0)
使用mysql_escape_string($_POST[''])
代替mysqlquery中的每个字段$_POST['']
。
答案 2 :(得分:0)
正如17.2.1 Control types所述:
提交表单后,只有“on”复选框控件可以变为successful。
换句话说,浏览器只会提交已经“检查”的复选框控件,但会提交每个文本框控件无论复选框控件的状态,您希望它是什么相关联。
因此,除非选中所有复选框控件,否则PHP从表单提交中创建的数组$_POST['checkbox']
和$_POST['textbox']
将包含不同数量的元素 - 因此,具有任何给定索引的数组可能不会匹配。
有两种方法可以解决这个问题:
如果取消选中相应的复选框,可以使用client-side scripting to disable the textbox:这会阻止浏览器提交文本框,因此, PHP中的数组将再次对齐(但请注意,此解决方案取决于客户端脚本的可用性 - 您必须测试并处理此类脚本不可用的情况);或
可以为控件提供显式索引,以确保它们始终对齐。
你也应该阅读正确的字符串转义(以及如何将错误暴露给你的应用程序以及bug和常被利用的攻击媒介):我完全推荐@ deceze的博客文章,{{ 3}}
特别是,正如他在文章中所描述的那样,您应该确保在传输到浏览器之前转义变量中的任何HTML(为了防止The Great Escapism (Or: What You Need To Know To Work With Text Within Text)和要输出的文本包含字符的错误在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中不仅使您容易受到XSS attacks的攻击,而且还会引入错误,其中字符串包含在SQL字符串文字中具有特殊含义的字符(例如{{ 1}})。
SQL injection attack是准备带有占位符的SQL语句,用于在命令执行时使用变量替换的参数;这也提供了性能提升,因为语句只需要准备一次,而不管它们执行的次数如何:
'