“字段列表”中的未知列

时间:2012-02-29 17:54:07

标签: php mysql

以下代码负责MySQL错误Error In Insert-->Unknown column 'expert manager' in 'field list'。如果我删除下面的代码,它将解决MySQL错误。你知道这段代码有什么问题吗?

$l=0;
$source = 'expertmanager';
mysql_query("DELETE FROM `student_questions` WHERE user_id=".$userId."");

for($i=0; $i < $count; $i++) 
{   
mysql_query("INSERT INTO `student_questions` (`user_id`, `checked_id`, `category_id`, course_id, `question`, `exe_order`, `time`,course_code, year, school, status, close, source) VALUES ('".$userId."', '".$_POST['checkbox'][$i]."', ".$this->cat.", ".$course_id.",'".$_SESSION['question']."','".(++$l)."', '".$time."', '".$course_code."', '".$year."', '".$school."', 1, ".$close.", ".$source.")") or die("Error In Insert-->".mysql_error()); 
}

谢谢!

4 个答案:

答案 0 :(得分:4)

这段代码出了什么问题:

变量名太短

请勿使用短于3-5个字符的变量名称。每个变量名称都应描述您要存储在其中的值。

//bad
$l=0;
//good
$executionOrder = 0;

查询连接

不要连接查询,这是一个导致错误,不安全的应用程序等的不良做法。不要使用mysql API,它已经过时,不安全并且将被弃用。请改用PDO和预备语句。

//bad
mysql_query("DELETE FROM `student_questions` WHERE user_id=".$userId."");

//good
$statement = $db->prepare("DELETE FROM `student_questions` WHERE user_id = ?);
$statement->execute(array($userId));

die()

的用法

我一直都看到它,我看到人们总是告诉其他人这样做。这简直就是不好的做法,现在是人们开始理解这一点的时候了。您无法以任何方式捕获错误。您无法记录错误。您无法控制是否应将其输出到屏幕。在开发环境中这样做是可以的,但肯定不是在生产环境中。

您很容易受到SQL注入攻击

永远不要将未经过滤/未转换的用户数据(会话,获取,发布,Cookie等)包含在您的查询中。

//really bad
$query = "SELECT something FROM table WHERE " . $_POST['someValue'];

//better
$query = "SELECT something FROM table WHERE " . mysql_real_escape_string($_POST['someValue']);

//even better: use prepared statements as shown above

最后是最小的错误和创建错误的那个

//bad
$query = "INSERT INTO `student_questions` (source) VALUES (expertmanager)"; //that's what you have

//better
$query = "INSERT INTO `student_questions` (source) VALUES ('expertmanager')";

答案 1 :(得分:0)

您是否有一个名为专家经理的专栏?如果是这样,请尝试将名称更改为“expert_manager”(不带引号),看看是否有效。

答案 2 :(得分:0)

您没有在查询的单引号中附加$source(字符串expert_manager)的值。

mysql_query("INSERT INTO `student_questions` (...snip...) VALUES (...snip...'".$school."', 1, ".$close.", '".$source."')") or die("Error In Insert-->".mysql_error()); 
//------------------------------------------------------------------------------------------------------^^^^^^^^^^^^^^^^

我们看不到$close的值,但如果它是一个字符串值而不是数字,那么它也应该用引号括起来。

附加说明:我看到$_POST['checkbox'][$i]直接传递给查询。如有必要,请确保已使用mysql_real_escape_string()正确验证并转义此输入。同样的规则可能适用于VALUES()列表中使用的其他变量,但我们无法通过发布的代码查看其来源。

答案 3 :(得分:0)

您在insert语句中忘记了多个值的引号:

for($i=0; $i < $count; $i++) 
{   
mysql_query("INSERT INTO `student_questions` (`user_id`, `checked_id`, `category_id`, course_id, `question`, `exe_order`, `time`,course_code, year, school, status, close, source) VALUES ('".$userId."', '".$_POST['checkbox'][$i]."', '".$this->cat."', '".$course_id."','".$_SESSION['question']."','".(++$l)."', '".$time."', '".$course_code."', '".$year."', '".$school."', 1, '".$close."', '".$source."')") or die("Error In Insert-->".mysql_error()); 
}

不仅是$ source,还有:$ course_id,$ close等等。