Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL查询中插入PHP变量_Php_Sql_Select - Fatal编程技术网

如何在SQL查询中插入PHP变量

如何在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的列进行比较

我有一个SQL查询

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