我认为这是一个逃避问题或其他问题。当我执行查询并填充所有变量时,一切都很好,所有行都在数据库中正确更新。
我查看了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行附近使用正确的语法
很抱歉,如果我不清楚的话。我会在需要的地方澄清。我是新生的。谢谢!
答案 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子句的末尾都有一个逗号,列表中的最后一个不应该有逗号。