代码之家  ›  专栏  ›  技术社区  ›  rob - not a robber

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

  •  2
  • rob - not a robber  · 技术社区  · 16 年前

    $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";
    

    http://somesite.com 错误:您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解第1行“”附近使用的正确语法

    6 回复  |  直到 16 年前
        1
  •  6
  •   Frank Farmer    16 年前

    在您设置的最后一件事之后不允许有逗号。

    $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";
    }
    

        2
  •  1
  •   Doug T.    16 年前

    记住,在这些编程语言中,每个语句(以;结尾的文本)都很像一个完整的句子。你需要一个主语-宾语动词才能让它有意义。我不能随便说

     doggy;
    

    不得不说

     feed the doggy;
    

     "fname = '$fname', "
    

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

        3
  •  1
  •   dnagirl    16 年前

    最好将所有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.
    } 
    
        4
  •  1
  •   pablasso Jordan    16 年前

    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();
    ?>
    

        5
  •  0
  •   jkndrkn    16 年前

    echo implode()

        6
  •  0
  •   Jeremy Morgan    16 年前

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