php mysqli查询函数在查询包含php变量时不执行

时间:2017-04-02 17:59:24

标签: php mysql mysqli

我真的很想得到一些帮助。我试图从一个表中返回一条记录,我在那里用名字和姓氏搜索该表,这是一个php变量$ employee_coor中的一个字符串。

这个问题是当我在查询语句中使用变量时它什么都不返回。没有任何错误。但是,如果我将变量回显到屏幕,则会看到员工的全名。然后我尝试将该全名复制到语句中,然后返回记录。

我还在查询上尝试了mysqli_num_rows以确定是否正在选择记录,并且当回显到屏幕时它返回0。

我真的不知道为什么我会这样,我希望这是我过度看的东西或类似的东西。下面的代码显示了脚本。

UPDATE :我在MySQL客户端测试了确切的查询本身,它运行得很好。唯一的区别是MySQL中的查询要有一个全名,而不是代表该名称的php变量。

    <?php
     include_once('dbconnect.php');

     if (!empty($_GET['employees'])) {

     $employee_coor = $_GET['employees'];

     $select = "SELECT * FROM employees 
                WHERE employees.employee_fname = substring_index('$employee_coor',' ',1) 
                AND employees.employee_lname = substring_index('$employee_coor',' ',-1)";

           $query = mysqli_query($con,$select);

           $cooridinator = mysqli_fetch_assoc($query);

           var_dump($cooridinator);

   } else{}
   ?>

3 个答案:

答案 0 :(得分:0)

我认为您的问题是您尝试在SELECT语句中执行substring_index()。你不能这样做。最好的办法是在SELECT语句中使用它们之前将员工名称拆分为2个变量。

答案 1 :(得分:0)

首先你做$ employee_coor = substring_index($ _ GET ['employees'],'',1);

您可以添加“。$ employee_coor。”,例如:

$select = "SELECT * FROM employeesWHERE employees.employee_fname = '" . $employee_coor . "' AND employees.employee_lname = '" . $employee_coor . "')";

或者您可以这样做:{$ employe_coor},例如:

$select = "SELECT * FROM employees WHERE employees.employee_fname = '{$employee_coor}' AND employees.employee_lname = '{$employee_coor}'";

或者最简单的方式:'$ employe_coor':

    $select = "SELECT * FROM employees WHERE employees.employee_fname = '$employee_coor' AND employees.employee_lname = '$employee_coor'";

完整示例:

<?php
include_once('dbconnect.php');

if (!empty($_GET['employees'])) {
    $employee_coor = substring_index($_GET['employees'], ' ', 1);
    //$select = "SELECT * FROM employees WHERE employees.employee_fname = '$employee_coor' AND employees.employee_lname = '$employee_coor'";
    //$select = "SELECT * FROM employeesWHERE employees.employee_fname = '" . $employee_coor . "' AND employees.employee_lname = '" . $employee_coor . "')";
    $select = "SELECT * FROM employees WHERE employees.employee_fname = '{$employee_coor}' AND employees.employee_lname = '{$employee_coor}'";
    $query = mysqli_query($con, $select);
    $cooridinator = mysqli_fetch_assoc($query);
    var_dump($cooridinator);
} else {
    //code
}

&GT;

答案 2 :(得分:0)

很难盯着构建SQL查询的PHP代码,并尝试诊断SQL查询的错误。为什么要这么难?

如果您对SQL语句有疑问,应该打印SQL并查看SQL,而不是构建SQL的PHP​​。我指的是在将PHP变量复制到其中之后的最终SQL字符串。一旦你看到最终查询为什么它不起作用,它可能会更清楚。

$select = "SELECT * FROM employees 
           WHERE employees.employee_fname = substring_index('$employee_coor',' ',1) 
           AND employees.employee_lname = substring_index('$employee_coor',' ',-1)";

error_log($select);

尝试复制最终的SQL并在MySQL客户端中尝试它。它给出零行吗?为什么?尝试编辑查询并删除WHERE子句的一个术语,然后删除另一个术语。那些给零行?

你明白了。 测试,不要猜。

无论如何,您的代码还有另一个问题:它易受SQL注入攻击。即使你试图处理一个名为&#34; O&#39; Reilly的人,它也会收支平衡。&#34;

我建议在将变量应用于SQL语句之前在PHP中拆分变量,并使用绑定参数。

$employee_coor = explode(' ', $_GET['employees']);

$select = "SELECT * FROM employees 
            WHERE employees.employee_fname = ? 
            AND employees.employee_lname = ?";

$stmt = mysqli_prepare($con,$select);
mysqli_stmt_bind_param($stmt, 'ss', 
  array_shift($employee_coor),
  array_pop($employee_coor));
mysqli_stmt_execute($stmt);