我遇到以下代码的问题。它被简化以显示问题。我使用循环,因为输入名称是相同的,需要在mysql表中创建多个新行。问题是我正在使用$ _POST ['name'] [$ i]并且表格不会接受,因为它不会将其视为'text?,...我认为。 就像我说的那样,代码已经大大简化了。
for($i=0;$i<count($_POST['url']); $i++) {
$sql = 'INSERT INTO urls (url) VALUES ('. $_POST['url'][$i].')';
if(!mysql_query($sql)) {
echo "error " . mysql_error();
}
}
我试图记住这个 -
$ sql ='INSERT INTO urls(url)VALUES('。'“'。$ _POST ['url'] [$ i]。'”''。')';
如果我这样做就行了,没有错误
$sql = 'INSERT INTO urls (url) VALUES (' " hello " ')';
这可能是一个新手类型的错误,对吧?感谢您对此的任何帮助。
答案 0 :(得分:2)
更清洁的方式(错误是固定的):
$urls = (isset($_POST['url']) && is_array($_POST['url'])) ? $_POST['url'] : array();
foreach($urls as $url) {
if(!is_string($url)) {
continue;
}
$sql = "INSERT INTO urls (url) VALUES ('" . mysql_real_escape_string($url) . "')";
if(!mysql_query($sql)) {
echo "error " . mysql_error();
}
}
确保$ _POST ['url']是一个数组将不会尝试将非数组(或不存在的键)视为数组。 is_string是为了防止用户试图抛出一个子数组来让PHP抛出“使用数组作为字符串”的注意事项。逃避是为了避免SQL注入,并且添加了单引号,因此MySQL知道它是一个字符串。
答案 1 :(得分:1)
您只需在MySQL查询中的POSTed值周围添加引号,如下所示。此外,如果您没有转义输入,那么这是一个巨大的SQL注入漏洞:
$data = mysql_escape_string($_POST['url'][$i]);
$sql = 'INSERT INTO urls (url) VALUES ("'.$data.'")';
查询破坏了MySQL,因为MySQL认为你的帖子值应该是没有引号的数字。
答案 2 :(得分:0)
查看mysql_error()返回的实际错误消息会很有帮助,但我认为你的问题是你没有像查询文本那样为sql查询提供$ _POST值。
尝试替换
$sql = 'INSERT INTO urls (url) VALUES ('. $_POST['url'][$i].')';
与
$sql = "INSERT INTO urls (url) VALUES ('". mysql_real_escape_string($_POST['url'][$i]) ."')";
答案 3 :(得分:0)
您需要在通过SQL语句插入$ _POST变量之前将其转义,最好使用mysql_real_escape_string()函数强化查询SQL injection attacks。
答案 4 :(得分:0)
Corbin提供的答案很好 - 但是尽量不要在循环中触发插入查询。
您可以将sql查询创建为一个字符串,然后触发插入查询一次。
您可以更改插入语句 插入表(字段)值(1); 插入表(字段)值(1);
要: 插入表(字段)值(1),(2),(3),(4)......
这是一个更优化的解决方案 - 但是mysql具有可以使用sql语句的最大长度 - 因此请使用您的最佳判断。
答案 5 :(得分:-2)
试试这句话
$sql = "INSERT INTO urls (url) VALUES ('". mysql_real_escape_string($_POST['url'][$i])."')";