如何在SQL查询中插入PHP变量
我有一个SQL查询如何在SQL查询中插入PHP变量,php,sql,select,Php,Sql,Select,我有一个SQL查询 qry1 = "SELECT DISTINCT (forename + ' ' + surname) AS fullname FROM users ORDER BY fullname ASC"; 从名为“用户”的表中获取FordNeNe和姓氏,并将它们串联在一起,在中间放置一个空格,并按升序排列。 然后,我将其放入一个数组中,并在其中循环以在选择下拉列表中使用 这是可行的,但是,我现在要做的是将fullname与另一个名为users的表中名为username的列进行比较
qry1 =
"SELECT DISTINCT (forename + ' ' + surname) AS fullname
FROM users
ORDER BY fullname ASC";
从名为“用户”的表中获取FordNeNe和姓氏,并将它们串联在一起,在中间放置一个空格,并按升序排列。 然后,我将其放入一个数组中,并在其中循环以在选择下拉列表中使用
这是可行的,但是,我现在要做的是将fullname与另一个名为users的表中名为username的列进行比较 不过,我正在努力学习如何编写查询。到目前为止我已经$qry2
"SELECT username
FROM users
WHERE (forename + ' ' + surname) AS fullname
=" . $_POST['Visiting'];
关于我做错了什么有什么建议吗?我不确定在“WHERE”之后使用声明的“AS”一词原则上是否正确 如果使用MySQL,查询应该如下所示:
SELECT [columns]
FROM [tables] [AS declareTableName]
WHERE [condition]
GROUP BY [declares|columns]
SORT BY [declares|columns]
但是,我认为你的问题不在查询中。在查询中串联名称不正确。必须在后端用名称分隔字符串,然后在查询中使用:
$names = explode(' ', $_POST['Visiting']);
假设您使用PDO,这可能会起作用:
$qry2 = "SELECT username FROM users
WHERE CONCAT(forename, ' ', surname) = '" . $conn->quote($_POST['Visiting']) . "'";
…但您应该看看通过SQL注入可能存在的漏洞
如果不知道您使用哪个库连接到MySQL数据库,就不可能给出正确的建议,告诉您应该使用哪个方法来转义用户的输入。是用于转义的PDO方法,与MySQLi等效。您可以使用此结构(不带“AS fullname”,变量周围带撇号): 但是为了更好的安全性(SQL注入),您应该使用变量的转义。例如,此构造,如果使用MySQL数据库:
$qry2 "SELECT username FROM users WHERE (forename + ' ' + surname) = '" . mysql_real_escape_string($_POST['Visiting']) . "'";
而是把这两列放在一起。还记得在将变量添加到查询之前对其进行转义
$qry2 =
"SELECT username AS fullname
FROM users
WHERE CONCAT(forename, ' ', surname)
='" . mysqli_real_escape_string($connection, $_POST['Visiting']) . "'";
其中$connection是您当前的数据库连接您确实应该参考使用PDO。 使用PDO时,可以将参数绑定到查询的指定部分。PDO还具有内置的SQL注入预防功能,这是一种非常好的安全措施,您无需自行处理。我希望这能回答你的问题。请参见下面的示例 示例:
如果您对PDO有任何其他问题,请参考以下内容:
官方PDO文档:
关于如何绑定变量的文档:
您想在mysqlcode>中连接两个或多个字符串,因为
(名字+“”+姓氏)全名是字符串,您需要引号:=”。$\u POST['visting'.“'";代码>。您应该尝试解决您的问题:当您在其中放入一些静态数据时,查询是否有效?您的MySQL连接是否显示了一些错误消息(您应该通过编辑它来添加到问题中)?在比较SQL注入后,共享两个表的数据和您想要的输出,这得到了我的反对票,因为SQL注入的危险。它将被复制和使用,戏剧将继续。我理解,很遗憾ginomay89没有反应,所以你可以更正你的答案。@KIKOSoftware这样更好?是的,更好,但现在ginomay89可能不知道如何处理$conn->quote()
方法。人们不应该再使用不推荐的mysql\u*
方法,这只是一个例子。sql注入保护非常重要。函数/类取决于使用的sql引擎(mysql、postgresql等)。
$qry2 =
"SELECT username AS fullname
FROM users
WHERE CONCAT(forename, ' ', surname)
='" . mysqli_real_escape_string($connection, $_POST['Visiting']) . "'";
// Create a new PDO object holding the connection details
$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// Create a SQL query
$query = "SELECT username FROM users WHERE (forename + ' ' + surname) AS fullname = :visiting;";
// Prepare a PDO Statement with the query
$sth = $pdo->prepare($query);
// Create parameters to pass to the statement
$params = [
':visiting' => $_POST['Visiting']
]
// Execute the statement and pass the parameters
$sth->execute($params);
// Return all results
$results = $sth->fetchAll(PDO::FETCH_ASSOC);