字段列表错误中的MySQL未知列

时间:2012-05-16 09:25:54

标签: php mysql

我在PHP中执行此语句时出现此错误:

    $sql = mysql_real_escape_string("INSERT INTO `locations`(`id`,`anchor_url`,`anchor_title`) 
    VALUES (1,`http%3A%2F%2Fmaps.google.com%2Fmaps%2Fms%3Fmsid%3D210426849026628615459.0004bd6aaf4e431aab7f9%26msa%3D0%26output%3Dembed`, `Se "Mar Menor" på kartet`)");

我认为它与引号有关,但我尝试了不同的引号,这给我提供了另一个错误,说我在SQL语法中有错误(单引号)。

执行上述查询时引发的错误是:

未知列'http%3A%2F%2Fmaps.google.com%2Fmaps%2Fms%3Fmsid%3D210426849026628615459.0004bd6aaf4e431aab7f9%26msa%3D0%26output%3Dembed'in'field list'

修改

答案被接受但仅限于其中一些,因为我没有测试提供的其他信息:我使用PDO来查询数据库而不是预备语句。

3 个答案:

答案 0 :(得分:3)

您无法在整个查询中调用mysql_real_escape_string;你必须分别在每个变量上调用它。

示例:

// THIS IS AN EXAMPLE ONLY -- NOT A BEST PRACTICE!
$sql = "INSERT INTO `locations`(`id`,`anchor_url`,`anchor_title`) VALUES ".
       "(1, '".mysql_real_escape_string('http://...')."', ".
       "'".mysql_real_escape_string('whatever')."')";

您还必须注意mres生成的值周围的单引号; 这些绝对是至关重要的

现在当然上面的内容看起来非常难看,所以你可以稍微改善一下:

// THIS IS AN EXAMPLE ONLY -- NOT A BEST PRACTICE!
$sql = sprintf("INSERT INTO `locations`(`id`,`anchor_url`,`anchor_title`) VALUES ".
               "(1, '%s', '%s')",
               mysql_real_escape_string('http://...'),
               mysql_real_escape_string('whatever'));

以上几乎是您清理数据库输入所必须做的最低限度。但如果您使用预准备语句(使用mysqliPDO扩展名),情况会好得多。

答案 1 :(得分:1)

$sql = mysql_real_escape_string("INSERT INTO 
locations(id,anchor_url,anchor_title) VALUES (1,'http%3A%2F%2Fmaps.google.com%2Fmaps%2Fms%3Fmsid%3D210426849026628615459.0004bd6aaf4e431aab7f9%26msa%3D0%26output%3Dembed', 'Se "Mar Menor" på kartet')");

答案 2 :(得分:0)

将撇号放在字符串值中,你有一个'字符

INSERT INTO `locations`(`id`,`anchor_url`,`anchor_title`) 
VALUES (1,'http%3A%2F%2Fmaps.google.com%2Fmaps%2Fms%3Fmsid%3D210426849026628615459.0004bd6aaf4e431aab7f9%26msa%3D0%26output%3Dembed', 'Se "Mar Menor" på kartet')