我有MySQL的查询,
return $this->resultQuery("SELECT COUNT(home_id) AS total
FROM `".$this->table_prefix."user_homes`
WHERE user_id = $assign_id ".
($home_cfg_id ? 'AND `home_cfg_id` IN (
SELECT `home_cfg_id`
FROM `'.$this->table_prefix.'server_homes`
WHERE home_cfg_id = '.$home_cfg_id' )': ''));
但运行此查询时仍然出错
答案 0 :(得分:1)
根据要求,我正在回答这个问题。在.
之后,您在查询字符串末尾缺少连结$home_cfg_id
。
当调试这样的东西时,按照@xQbert的建议做这些通常很有帮助,并输出sql字符串。这将允许您查看查找任何看起来错误的内容 - 以及(可能)如果字符串创建不正确,则会给出更清晰的PHP错误。
return $this->resultQuery("SELECT COUNT(home_id) AS total
FROM `".$this->table_prefix."user_homes`
WHERE user_id = $assign_id ".
($home_cfg_id ? 'AND `home_cfg_id` IN (
SELECT `home_cfg_id`
FROM `'.$this->table_prefix.'server_homes`
WHERE home_cfg_id = '.$home_cfg_id.' )': ''));
^
答案 1 :(得分:1)
通过盯着构建SQL的代码来调试SQL很困难。它也很难使用字符串连接语法而不会出错。
以下是一些使这种调试变得更容易的技巧:
提示1:在字符串中引用变量而不是使用.
连接。
$string = 'part 1' . $variable . 'part 2';
也可以写成:
$string = "part1{$variable}part2";
花括号是可选的,除非您的变量名称会遇到以下文字文本,或者您使用复杂的PHP对象和数组:
$string = "part1{$var['key']}part2{$obj->field}part3";
但是我喜欢在将变量放入字符串时一致地使用花括号,因为它可以很容易地看到PHP变量的位置。
提示2:使用临时变量:
$user_homes = "{$this->table_prefix}user_homes";
$server_homes = "{$this->table_prefix}server_homes";
提示3:在使用之前构建SQL查询。避免使用三元运算符?:
,而是使用if()
。无论如何,在某些情况下你还是需要它,所以你也可以保持一致。
$sql = "SELECT COUNT(home_id) AS total
FROM `{$user_homes}`
WHERE user_id = {$assign_id}";
if ($home_cfg_id) {
$sql .= " AND `home_cfg_id` IN (
SELECT `home_cfg_id`
FROM `{$server_homes}`
WHERE home_cfg_id = {$home_cfg_id}";
}
// Here you can log the SQL query if you need to debug
return $this->resultQuery($sql);
这使您的代码更易于阅读,更易于调试,更易于修改。