如何将PHP变量插入SQL查询

时间:2018-10-01 11:03:30

标签: php sql select

我有一个SQL查询

qry1 = 
"SELECT DISTINCT (forename + ' ' + surname) AS fullname
FROM users
ORDER BY fullname ASC";

这从称为用户的表中获取姓氏和姓氏,并将它们连接在一起,在中间放置一个空格,然后按升序排列。

然后我将其放入数组并循环遍历以在选择下拉列表中使用。

这可行,但是,我现在要做的是将全名与另一个名为“用户”的表中名为“用户名”的列进行比较。

我正在努力编写查询语句。到目前为止,我有...

$qry2 
"SELECT username 
FROM users 
WHERE (forename + ' ' + surname) AS fullname 
=" . $_POST['Visiting'];

关于我在做什么错的任何建议?

5 个答案:

答案 0 :(得分:1)

宁可CONCAT两列在一起。另外请记住在将变量添加到查询中之前先对其进行转义。

$qry2 =
"SELECT username AS fullname
FROM users 
WHERE CONCAT(forename, ' ', surname)
='" . mysqli_real_escape_string($connection, $_POST['Visiting']) . "'";

$ connection是您当前的数据库连接

答案 1 :(得分:0)

我不确定在“ WHERE”之后使用声明的单词“ AS”在原则上是否正确。

如果使用MySQL,查询应如下所示:

SELECT [columns]
FROM [tables] [AS declareTableName]
WHERE [condition]
GROUP BY [declares|columns]
SORT BY [declares|columns]

但是,我认为您的问题不在查询中。在查询中串联名称不正确。您必须在后端使用名称分隔字符串,然后在查询中使用它:

$names = explode(' ', $_POST['Visiting']);

答案 2 :(得分:0)

如果您使用PDO,这可能会起作用:

$qry2 = "SELECT username FROM users
      WHERE CONCAT(forename, ' ', surname) = '" . $conn->quote($_POST['Visiting']) . "'";

...但是您应该看看SQL注入可能带来的漏洞。

在不知道使用哪个库连接到MySQL数据库的情况下,不可能就应该使用哪种方法来转义用户的输入给出适当的建议。 quote是用于转义的PDO方法,real-escape-string与MySQLi等价

答案 3 :(得分:0)

您应该真正参考使用PDO。 使用PDO时,可以将参数绑定到查询的指定部分。 PDO还具有内置的SQL注入预防功能,这是一个很好的安全措施,您无需自己处理。我希望这回答了你的问题。参见下面的示例。

示例:

// 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);


如果您对PDO还有其他疑问,请参阅以下内容:

PDO官方文档:
http://php.net/manual/en/book.pdo.php

有关如何绑定变量的文档:
http://php.net/manual/en/pdostatement.bindparam.php

答案 4 :(得分:-1)

您可以使用以下结构(不带“ AS全名”,并且变量周围带有撇号):

$qry2 "SELECT username FROM users WHERE (forename + ' ' + surname) = '" . $_POST['Visiting'] . "'";

但是为了获得更好的安全性(SQL注入),应使用变量的转义。例如,如果您使用MySQL数据库,则此构造:

$qry2 "SELECT username FROM users WHERE (forename + ' ' + surname) = '" . mysql_real_escape_string($_POST['Visiting']) . "'";