【问题标题】:php- error in sql syntaxphp-sql语法错误
【发布时间】:2018-12-16 17:28:29
【问题描述】:

我正在尝试将表单数据插入到我的数据库中的一个表中。要插入的数据是姓名、电子邮件、当前日期和用户兴趣。 这是代码。

if (isset($_POST['name'])) {
   $name = $_POST['name'];
   $email = $_POST['email'];
   $intrests = $_POST['intrests'];
   $default_intrests = array("mob","pcs","scm","oth");
   $interests = "";
   if (count($intrests) == 0) {
      $interests = implode(",", $default_intrests);
   }
   else {
          $interests = implode(",", $intrests);
   }

   $sqll="insert into subscriptions (name,email,subdate,intrests) values ($name,$email,CURRENT_DATE, $interests)";
   $insert = mysqli_query($link, $sqll);
   if (!$insert) {
      echo mysqli_error($link);
   }
}

表单提交时,显示如下错误:

您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的“dsa,asdf@qwer.com,CURRENT_DATE, mob)”附近使用正确的语法

【问题讨论】:

  • 在查询中为字符串值添加单引号。'
  • 使用准备好的语句和绑定变量来解决各种问题,添加引号只是临时解决方案。

标签: php mysql sql mysqli mariadb


【解决方案1】:

' 添加到值中,因为其中一些是string

 $sqll="insert into subscriptions (name,email,subdate,intrests)
     values ('$name','$email',CURRENT_DATE, '$interests')";

其实直接把参数写到你的sql里面是不好的,你最好用prepared-statements来做,避免SQL Injection

【讨论】:

    【解决方案2】:
    mysql_query("insert into table values('data1', 'data2' )");
    

    【讨论】:

    • 您可以在答案中添加更多上下文吗?为什么要再使用已弃用的mysql_* 方法?
    【解决方案3】:
        // User Entered fields
        // *** This is dangerous, it is subject to sql injection, 
        $query = "insert into subscriptions(name,email,subdate,intrests)
                 values ('$name','$email',CURRENT_DATE, '$interests')";
    
        $result = mysqli_query( $link, $query);
    
        // *** Error checking, what if !$result? eg query is broken
    
        $row = mysqli_fetch_array($result);
    
        if(!$row){
    
            echo "No Row inserted";
        }
        else {
           echo "OK";
        }
    

    如果要使用任何 PHP 变量,则永远不要使用 mysqli_query(),而始终坚持使用准备好的语句,如下所示:

    $stmt = $mysqli->prepare("insert into subscriptions name,email,subdate,intrests)
                                 values (?,?,CURRENT_DATE, ?)");
    $stmt->bind_param('sss', $class);
    $stmt->execute();
    $data = $stmt->get_result()->fetch_all();
    

    【讨论】:

    • 您对bind_param() 的调用需要额外的参数。
    【解决方案4】:

    尝试将当前日期存储到变量中

    类似的东西

    if (isset($_POST['name'])) {
                $name=$_POST['name'];
                $email=$_POST['email'];
                $intrests=$_POST['intrests'];
                $CURRENT_DATE = date("Y-m-d");
                $default_intrests=array("mob","pcs","scm","oth");
                $interests="";
                if(count($intrests)==0){
                    $interests= implode(",", $default_intrests);
                }else{
                    $interests= implode(",", $intrests);
                }
    
                $sqll="insert into subscriptions (name,email,subdate,intrests) values ('$name','$email','CURRENT_DATE', '$interests')";
                $insert= mysqli_query($link, $sqll);
                if (!$insert) {
                    echo mysqli_error($link);
                }
            }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      • 2014-08-22
      • 1970-01-01
      相关资源
      最近更新 更多