PHP,尝试将$ _POST ['var']作为文本放入表中

时间:2011-12-17 04:34:13

标签: php mysql

我遇到以下代码的问题。它被简化以显示问题。我使用循环,因为输入名称是相同的,需要在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 " ')';

这可能是一个新手类型的错误,对吧?感谢您对此的任何帮助。

6 个答案:

答案 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])."')";