以下代码负责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());
}
谢谢!
答案 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));
我一直都看到它,我看到人们总是告诉其他人这样做。这简直就是不好的做法,现在是人们开始理解这一点的时候了。您无法以任何方式捕获错误。您无法记录错误。您无法控制是否应将其输出到屏幕。在开发环境中这样做是可以的,但肯定不是在生产环境中。
永远不要将未经过滤/未转换的用户数据(会话,获取,发布,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等等。