PHP MySQL查询其中x = $变量来自函数

时间:2017-07-05 21:14:03

标签: php mysql

为什么这不起作用:

function listOrderComments ($factnr){
global $connection;

//$factnr = 123; //or $factnr = "123"; (Both work) 

$query = "SELECT * FROM orderstatus WHERE factuurnummer = '$factnr'"; 
$result = mysqli_query($connection, $query);

当我回复$factnr时,我得到了" 123"回来。

当我取消评论//$factnr = 123;时,我的功能正常运作。

到处寻找解决方案。检查类型$factnr是否为(字符串)。

4 个答案:

答案 0 :(得分:4)

如果您在查询中使用变量,那么您可以为自己打开注射攻击。

如果您要使用该变量,我建议您使用bind_param进行查询

阅读下面的PHP手册链接,您将能够找出问题

http://php.net/manual/en/mysqli-stmt.bind-param.php

如果你将一个变量传递给你的函数,它应该已经设置好,所以我不明白你为什么要将它设置为123。因此,执行sql语句并在PHP文档页面上的第一个示例之后绑定参数。

public function listOrderComments ($factnr){
global $connection; 
//$factnr = 123;
//or $factnr = "123"; 
$query = "SELECT * FROM orderstatus WHERE factuurnummer = ?";
$sql->prepare($query);
$sql->bind_param("s", $factnr);
$sql->execute();
$result = $sql->get_result();
$data = mysqli_fetch_all($result, MYSQLI_ASSOC);

foreach ($data as $row) {
print_r($row);
}

然后用结果做你想做的事

答案 1 :(得分:1)

你可以选择:

$query = "SELECT * FROM orderstatus WHERE factuurnummer = ". $factnr; 

答案 2 :(得分:0)

正确使用"溺爱" CONCAT。以下将正常工作:

$factnr = 123; 
$query = "SELECT * FROM orderstatus WHERE factuurnummer = " . $factnr; 

<强>更新

这里是$ factnr传递的参数应该是整数。安全代码的方式是不要使用havvy函数,甚至不要使用更多的complicated PDO,但只需验证,这个变量是否为整数与否之前,如果不是整数,则返回一些错误代码。这样就没有代码注入SQL查询的危险。

function listOrderComments ($factnr){
global $connection;

if (!is_int($factnr)) return -1

//$factnr = 123; //or $factnr = "123"; (Both work) 

$query = "SELECT * FROM orderstatus WHERE factuurnummer = " . $factnr; 
$result = mysqli_query($connection, $query);

答案 3 :(得分:0)

连接代码不是好习惯。您最好的解决方案是使用PDO statements。这意味着您的代码更容易查看,如果恶意代码在您的验证中滑落,这可以防止SQL注入发生。

以下是您将使用的代码示例。

<?php

 // START ESTABLISHING CONNECTION...
$dsn = 'mysql:host=host_name_here;dbname=db_name_here';
//DB username
$uname = 'username_here';
//DB password
$pass = 'password_here';

try
 {

 $db = new PDO($dsn, $uname, $pass);

 $db->setAttribute(PDO::ERRMODE_SILENT, PDO::ATTR_EMULATE_PREPARES);
 error_reporting(0);
 } catch (PDOException $ex)
 {
 echo "Database error:" . $ex->getMessage();
 }

// END ESTABLISHING CONNECTION - CONNECTION IS MADE.


 $factnr = "123" // or where-ever you get your input from.

 $query = "SELECT * FROM orderstatus WHERE factuurnummer = :factnr";

 $statement = $db->prepare($query);

 // The values you wish to put in.
 $statementInputs = array("factnr" => $factnr);

 $statement->execute($statementInputs);

 //Returns results as an associative array.
 $result = $statement->fetchAll(PDO::FETCH_ASSOC);

 $statement->closeCursor();

 //Shows array of results.
 print_r($result);
 ?>