我有一张 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();
这只是一个示例,还有其他方法(上面链接中列出了一些示例)。