【问题标题】:How can I insert php variables in a sql query?如何在 sql 查询中插入 php 变量?
【发布时间】:2015-04-12 20:48:30
【问题描述】:

我找到了很多似乎对我不起作用的答案。 当我在变量 $message 和 $email 和 $date 周围有撇号时,就像

    'VALUES ('$message', '$email', '$date')';

它告诉我

解析错误:语法错误,意外'$message' (T_VARIABLE)

当我删除它们时,我得到类似无法输入数据:“字段列表”中的未知列“$message”。我试过插入

    $message = mysql_real_escape_string($message);    
    $email = mysql_real_escape_string($email);
    $date = mysql_real_escape_string($date);

在变量周围加“”

'VALUES ("$message", "$email", "$date")';

它消除了错误消息,但现在,我的数据库中没有输入来自 html 表单的输入,而是字面上的“$message”。

我做错了什么? 我的简单目标只是获取一封电子邮件、一条消息和日期,并将其放入数据库中。请帮忙!谢谢!

这是我拥有的完整代码:

     <?php
if($_POST && isset($_POST['email'], $_POST['essay'])) {


    $dbhost = 'localhost';
    $dbuser = 'root';
    $dbpass = 'password';

    $conn=mysql_connect($dbhost, $dbuser);
    if(! $conn)
    {
        die('Could not connect: ' . mysql_error());
    }

    mysql_select_db("Ink", $conn);

    date_default_timezone_set("America/New_York");
    $message = $_POST['essay'];
    $email = $_POST['email'];
    $date = date("y-m-d h:i:sa");


    $sql = 'INSERT INTO inktable '.
            '(writings, email, date) '.
            'VALUES ('$message', '$email', '$date')';

    mysql_select_db('ink');
    $retval = mysql_query($sql, $conn);
    if(! $retval)
    {
        die('Could not enter data: ' .mysql_error());
    }

    mysql_close($conn);
}
?>

【问题讨论】:

  • 有人告诉过你关于 SQL 注入的事吗?
  • 尝试 INSERT INTO inktable '。 '(写作,电子邮件,日期)'。 'VALUES ('{$message}', '{$email}', '{$date}')';如果可以,请使用 PDO
  • 使用 mysqli_ 代替 mysql_ 。你也可以使用 pdo。 Mysql 已弃用,完全不推荐

标签: php sql forms parsing variables


【解决方案1】:

我认为你需要这些小点:

  ('.$message.', '.$email.', '.$date.')';

或者:

 ("'.$message.'", "'.$email.'", "'.$date.'")';

【讨论】:

    【解决方案2】:

    另外,最好使用 PDO,作为我认为最小化问题的最简单方法;)使用准备好的语句,可以将 SQL 注入的风险降到最低,正如 Biffen 所说。 p>

    http://php.net/manual/en/ref.pdo-mysql.php

    例如,您的带有 PDO 的代码:

    <?php
    
    if($_POST && isset($_POST['email'], $_POST['essay'])) {
    
    $dbhost = 'localhost';
    $dbuser = 'root';
    $dbpass = 'password';
    $dbname = 'Ink';
    
    date_default_timezone_set("America/New_York");
    
    try {
    // Try to connect
        $dbh = new PDO('mysql:host='.$dbhost.';dbname='.$dbname, $dbuser, $dbpass);
    
    // Data 
        $message = $_POST['essay'];
        $email = $_POST['email'];
        $date = date("y-m-d h:i:sa");
    
    // query
        $sql = "INSERT INTO inktable (message,email,date) VALUES (:message,:email,:date)";
        $q = $dbh->prepare($sql);
        $q->execute(array(':message'=>$message,
                          ':email'=>$email,
                          ':date'=>$date));
    
    // Null connection
        $dbh = null;
    } catch (PDOException $e) { // if exception
        print "Error!: " . $e->getMessage() . "<br/>";
        die();
    }
    
    ?>
    

    【讨论】:

    • 修复它;)第一个代码没有检查,对不起。 P.s.:问题其实出在这一行:$dbh = new PDO('mysql:host='.$dbhost.';dbname='.$dbname, $dbuser, $dbpass);注意引号,@jojo-wang
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    相关资源
    最近更新 更多