我有一个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'];
关于我在做什么错的任何建议?
答案 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']) . "'";