如何在 sql 查询中插入 php 变量?
Posted
技术标签:
【中文标题】如何在 sql 查询中插入 php 变量?【英文标题】:How can I insert php variables in a sql query? 【发布时间】: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 已弃用,完全不推荐
【参考方案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以上是关于如何在 sql 查询中插入 php 变量?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PHP、SQL 和 Microsoft Access 将另一个表中的 select max 函数和用户输入的变量插入表中?