尝试执行条件更新时,MySQL或PHP语法疏忽

时间:2009-11-10 01:23:35

标签: php mysql

我认为这是一个逃避问题或其他问题。当我执行查询并填充所有变量时,一切都很好,所有行都在数据库中正确更新。

我查看了StackOverflow,让我在飞行查询中使用这些动态/构建的滚动,我就在我的绳索尽头。

我的东西看起来像这样:

$sql="UPDATE users SET ";

if (!empty($fname)) { "fname = '$fname', ";}

if (!empty($lname)) { "lname = '$lname', ";}

if (!empty($location)) { "location = '$location', ";}

if (!empty($url)) { "url = '$url', ";}

"WHERE id = '$id' LIMIT 1";

当我打破查询以插入“IF”时,我不断得到以下内容: 错误:您的SQL语法中有错误;查看与您的MySQL服务器版本相对应的手册,以便在第1行附近使用正确的语法

我回答了查询,并且由于一些奇怪的原因它不能完成,变量会在查询开始之前就这样进行

fname ='Rob',lname ='Smith',location ='Jersey City,NJ',url ='http://somesite.com',更新用户SET 错误:SQL语法中有错误;查看与您的MySQL服务器版本相对应的手册,以便在第1行附近使用正确的语法

很抱歉,如果我不清楚的话。我会在需要的地方澄清。我是新生的。谢谢!

6 个答案:

答案 0 :(得分:6)

在您设置的最后一件事之后,您不能使用逗号。

一个简单的解决方案就是:

$set = array();
if (!empty($fname)) { $set[] = "fname = '$fname'";}
if (!empty($lname)) { $set[] = "lname = '$lname'";}
if (!empty($location)) { $set[] = "location = '$location'";}
if (!empty($url)) { $set[] = "url = '$url'";}

if(!empty($set)) {
  $sql = "UPDATE users SET ";
  $sql .= implode(', ', $set)
  $sql .= " WHERE id = '$id' LIMIT 1";
}

哦,确保你在查询中推断的变量是SQL安全的;否则你会遇到SQL注入问题。

答案 1 :(得分:1)

请记住,在这些编程语言中,每个语句(以;结尾的文本)就像一个完整的句子。你需要一个subject-object-verb来使它有意义。我不能只说

 doggy;

我不得不说

 feed the doggy;

同样,我不能只说

 "fname = '$fname', "

当我的意思是“将此字符串附加到我之前开始的查询”时。我必须明确:

 $sql .= "fname = '$fname', ";

我说“将此文本附加到$ sql”。这是一个完整的句子。

答案 2 :(得分:1)

最好将所有SET放入一个数组中并将它们内嵌到一个字符串中。这样你可以肯定没有悬空的逗号。类似的东西:

if (!empty($fname)) $sets[]="fname = '$fname' ";
if (!empty($lname)) sets[]= "lname = '$lname' ";
if (!empty($location)) sets[]= "location = '$location' ";
if (!empty($url)) sets[]= "url = '$url' ";

$setstring= implode(',',$sets);
if($setstring) {
  $query="UPDATE users SET $sets WHERE id = '$id' LIMIT 1";
  //run query, etc.
} 

答案 3 :(得分:1)

不是直接的答案,但对于动态查询,我建议使用PDO。这样,您可以更安全,更优雅,更轻松地指定可选参数。

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
?>

如果您的查询变得更大,那么您现在的工作方式将非常复杂。

答案 4 :(得分:0)

echo查询您的查询并查看SET caluse中的逗号。你有太多了吗?不够?我想你会发现你有一个额外的逗号。您可能希望使用implode()函数来构建SET子句。这将在适当的位置插入适当数量的逗号。

答案 5 :(得分:0)

我看到两个问题,在WHERE之前没有空格,这意味着它可能会变成“url = http://www.stackoverflow.com”WHERE“并且可能会导致问题。

此外,每个SET子句的末尾都有一个逗号,列表中的最后一个不应该有逗号。