php - 查询未返回预期结果

标签 php mysql sql

<分区>

我有一张 table 用来留住顾客。另一个我负责销售的地方。

当我保存一些时,我会继续销售客户 ID,当我显示在列表中时, 我用 id 给客户看

问题是,在寻找销售时,不要让我一个人呆着,那些已登录的客户会向我显示所有记录

$query = "SELECT  * 
  FROM ventas 
  WHERE idusuario = $_SESSION[k_username] 
  union 
  SELECT  * 
  FROM reparaciones 
  WHERE marca LIKE '%" . $name .  "%' 
  OR modelo LIKE '%" . $name ."%'" ;

还有这个

$query="SELECT  * 
  FROM ventas 
  WHERE idusuario = $_SESSION[k_username] 
     marca LIKE '%" . $name .  "%' 
  OR modelo LIKE '%" . $name ."%'";

但都没有用

最佳答案

欢迎来到 SO。

我强烈建议您对 SQL Injection 做一些研究和 Prepared Statements .我将按原样解决您的问题,而不考虑您当前设置方式的安全漏洞。

您的查询字符串无效,试试这个:

$query = "SELECT  * 
    FROM ventas 
    WHERE idusuario = '". $_SESSION['k_username'] ."' 
    UNION 
    SELECT  * 
    FROM reparaciones 
    WHERE marca LIKE '%". $name ."%'
        OR modelo LIKE '%". $name ."%'
    ";

$query = "SELECT  * 
    FROM ventas 
    WHERE idusuario = '". $_SESSION['k_username'] ."' 
        OR marca LIKE '%". $name ."%' 
        OR modelo LIKE '%". $name ."%'
    ";

此外,在您使用联合的第一个查询中,请确保该查询的两个部分返回相同数量的列。

更新

SQL 注入(inject)的示例可以在整个 Internet 上找到(包括在我上面链接的 php.net 手册页上)。从您在 OP 中给出的示例中,不清楚您是否正在清理数据,即: $_SESSION['k_username'] 和 $name 并且由于您将这些直接包含在查询字符串中,因此这些可能是注入(inject)点。

例如,如果 $name 恰好是用户输入(比如来自搜索表单)并且用户提供:

x'; DELETE FROM usuario WHERE 1=1; --

现在,当它在您的第二个查询中使用时,您的查询字符串变为(仅使用 123 作为用户 ID 作为示例):

SELECT  * FROM ventas WHERE idusuario = 123 OR marca LIKE '%x'; DELETE FROM usuario WHERE 1=1; --%' OR modelo LIKE '%". $name ."%'

现在,当该查询运行时,您的用户表变为空。

当然,这只是一个例子。也许你的用户表不叫'usuario'......事实仍然是你有一个漏洞并且它为某人渗透你的系统留下了机会。也许他们只会浏览一些数据(用户名、密码、联系信息等),也许他们会注入(inject)自己的数据,也许他们会破坏您的整个数据库,谁知道呢。您真的要冒这个风险吗?

下面是一个示例,说明如何使用准备好的语句来帮助降低这种风险:

$sql = "SELECT  * 
    FROM ventas 
    WHERE idusuario = :userid 
        OR marca LIKE ':name'
        OR modelo LIKE ':name'
    ";
$params = array(
    'userid' => $_SESSION['k_username'],
    'name' => '%'. $name .'%'
);

$db = new PDO(...); // replace ... with your connection info
$query = $db->prepare($sql);
$query->execute($params);
$results = $query->fetchAll();

这只是一个示例,还有其他方法(上面链接中列出了一些示例)。

关于php - 查询未返回预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30607071/

相关文章:

mysql - 'SubQuery 返回多于一行' 用例 When

mysql - rake db :create not working for legacy rails app (2. 3.5) 使用 MySQL (5.5.28)

sql - 将一列拆分或子化为多列

mysql - 重复 key 更新半工作

php - 将 angularjs 值传递给 PHP 变量

php - php中这两个语句有什么区别?

php - 使用 CakePHP 批量导入 CSV 文件

php - 防止动态 SQL 中的 SQL 注入(inject)

asp.net - 我的数据库表未排序

mysql - SQL 查询返回已删除的行