【问题标题】:php mysqli query function not executing when the query contains php variable当查询包含php变量时,php mysqli查询函数未执行
【发布时间】:2017-04-02 17:59:23
【问题描述】:

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

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

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

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

更新:我在 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{}
   ?>

【问题讨论】:

  • 了解连接,从字符串连接变量/函数尝试这样做'".substring_index()."'。 @Dez 不,这将导致删除单引号时出错。
  • @Dez 如果这样做会返回错误。
  • 我现在试试那个方法@Rolijhon
  • 1.将mysqli_real_escape_string 用于$employee_coor$employee_coor = mysqli_real_escape_string($con, $_GET['employees']);。 2. SUBSTRING_INDEX()MySQL function 所以保持原样。
  • @Deadooshka 是的,是的,我不知道为什么我会忘记这一点,并听取了所有这些关于连接的 cmets ......我现在将尝试逃生 api

标签: php mysql mysqli


【解决方案1】:

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

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

$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 注入的影响。即使您尝试处理名为“O'Reilly”的人,它也会中断。

我建议在将变量应用到 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);

【讨论】:

  • 嗨,比尔,有几件事。我在 MySQL 客户端中测试了确切的查询本身,它运行良好。我也试过你爆炸字符串的方法,但我仍然遇到同样的问题。不过,您的建议非常有用。我打算稍后解决 SQL 注入问题,但感谢您指出这一点。
  • “安全性和正确性一样,不是附加功能。” — 安德鲁·S·塔南鲍姆
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    首先你做 $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
    }
    

    ?>

    【讨论】:

      猜你喜欢
      • 2019-02-07
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      • 2013-09-23
      • 2015-05-05
      • 1970-01-01
      相关资源
      最近更新 更多