查询未返回预期结果

时间:2015-06-02 21:38:07

标签: php mysql sql

我有一张桌子,我会留住顾客。另一个我继续销售的地方。

当我保存一些时,我会继续销售客户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 ."%'";

但它们都不起作用

4 个答案:

答案 0 :(得分:2)

欢迎来到SO。

我强烈建议您对SQL InjectionPrepared 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注入的例子可以在互联网上找到(包括我上面链接的php.net手册页)。从您在OP中提供的示例中,不清楚您是否正在清理数据,即:$ _SESSION ['k_username']和$ name,并且当您将这些直接包含在查询字符串中时,这些可能是注入点。

例如,如果$ 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'......事实仍然是你有一个漏洞,它留下了一个让某人渗透你的系统的空缺。也许他们只会浏览一些数据(用户名,密码,联系信息等),也许他们会注入自己的数据,也许他们会破坏整个数据库,谁知道。你真的想冒这个风险吗?

以下是一个如何使用预准备语句来帮助降低风险的示例:

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

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

答案 1 :(得分:0)

您是否在查询字符串中尝试了嵌入变量的括号(如此)?

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

答案 2 :(得分:0)

感谢所有恶魔

这解决了

$query = "SELECT * FROM `ventas` WHERE `marca` LIKE '%" . $name ."%' AND `idusuario` = 2 ORDER BY `idusuario` ASC ";

但现在的问题是 而不是idusuario = 2我想要像

这样的东西
$query = "SELECT * FROM `reparaciones` WHERE `marca` LIKE '%" . $name ."%' AND `idusuario` = $_SESSION[k_username] ORDER BY `idusuario` ASC ";

谢谢:)

答案 3 :(得分:0)

解决了yopeeee :)非常感谢大家

   cat1   dog1   dog2  
0   red   red    blue  
2   blue  red    blue  
3   blue  blue   green