【问题标题】:Innerjoin With Where Clause?内部加入 Where 子句?
【发布时间】:2013-01-13 03:33:31
【问题描述】:
$InnerJoinQuery = $STD->query("
        SELECT Users.ID, Users.Username, Users.Password, UserInformation.LastName, UserInformation.Firstname, UserInformation.DOB
        FROM Users AS Users 
        INNER JOIN UserInformation AS UserInformation 
        ON Users.ID = UserInformation.UserID WHERE Users.Username=".$_SESSION['real_name']."");
        $InnerJoinArray = $InnerJoinQuery->fetch_array(MYSQLI_ASSOC);

我上面的代码导致错误。它适用于我的WHERE 子句。

WHERE Users.Username=".$_SESSION['real_name']."

我怎样才能将它嵌入到我的内部连接中?

更新:

$InnerJoinQuery = $STD->query("
        SELECT Users.ID, Users.Username, Users.Password, UserInformation.LastName, UserInformation.Firstname, UserInformation.DOB
        FROM Users
        INNER JOIN UserInformation
        ON Users.ID = UserInformation.UserID WHERE Users.Username = '".$_SESSION['real_name']."'");
        $InnerJoinArray = $InnerJoinQuery->fetch_array(MYSQLI_ASSOC);



        $_SESSION['UID'] = $InnerJoinArray['ID'];
        $_SESSION['Password'] = $InnerJoinArray['Password'];
        $_SESSION['Firstname'] = $InnerJoinArray['Firstname'];
        $_SESSION['LastName'] = $InnerJoinArray['LastName'];
        $_SESSION['DOB'] = $InnerJoinArray['DOB'];
            print_r($_SESSION);

这会返回:

Array ([real_name] => inhumaneslayer [Password] => [UID] => [Firstname] => [LastName] => [DOB] => )

这是意料之外的。

当我将查询更改为:

$InnerJoinQuery = $STD->query("
        SELECT Users.ID, Users.Username, Users.Password, UserInformation.LastName, UserInformation.Firstname, UserInformation.DOB
        FROM Users
        INNER JOIN UserInformation
        ON Users.ID = UserInformation.UserID WHERE Users.Username = 'inhumaneslayer'");

我得到了预期的结果:

Array ([real_name] => inhumaneslayer [Password] => PASSWORDHIDDEN [UID] => 5 [Firstname] => xx [LastName] => xx [DOB] => DOBHIDDEN)

这是预期的。

在更改 SQL 之前,我正在通过 unset($_SESSION); 取消会话

【问题讨论】:

  • 此代码可能容易受到二阶 SQL 注入的影响。请参数化您的查询。

标签: php mysql inner-join


【解决方案1】:

您必须将字符串括在引号中:

... Users.Username='".$_SESSION['real_name']."'")

另外 - 您需要正确转义变量。您将如何做到这一点 - 取决于您使用的数据库库。在您的情况下,它是http://php.net/manual/en/mysqli.real-escape-string.php

... Users.Username='". $STD->real_escape_string($_SESSION['real_name']) ."'")

但更好 - 学习如何使用准备好的语句http://php.net/manual/en/mysqli.prepare.php

$stmt = $STD->query("
        SELECT Users.ID, Users.Username, Users.Password, UserInformation.LastName, UserInformation.Firstname, UserInformation.DOB
        FROM Users AS Users 
        INNER JOIN UserInformation AS UserInformation 
        ON Users.ID = UserInformation.UserID WHERE Users.Username=?");

$stmt->bind_param("s", $_SESSION['real_name']);

$stmt->execute();
$result = $stmt->get_result();

$InnerJoinArray = $result->fetch_array();

【讨论】:

  • 返回空白,当我更改为WHERE Users.Username='test'"); 时返回结果,$_SESSION['real_name'] 已正确设置
  • @user1968541:我不确定我明白你在说什么
  • @user1968541: var_dump($_SESSION['real_name']); 并在此处复制粘贴结果
  • @user1968541:我只看到案例的不同之处。换个大小写看看会不会改变结果
【解决方案2】:

您忘记了字符串周围的(单/双)引号(您正在寻找一个字符串,而不是整数?)

试试:".... WHERE Users.Username='".$_SESSION['real_name']."'")

否则,按照你的方式,它会搜索

WHERE Users.Username=some_string(而不是Users.Username='some_string')将返回错误,因为some_string 是一个字符串,需要用引号括起来


如果仍然没有结果:

尝试将您的查询放入变量$query = "SELECT Users .....";

然后echo $query 看看你的 $_SESSION 变量实际产生了什么。在不知不觉中,我无能为力。

【讨论】:

  • “或撇号” --- 你是什么意思?
  • @zerkms 对不起,我听了很多 Zappa... 改变了它
  • 使用@zerkms 评论我完成了他的更改并且:返回空白,当我更改为 WHERE Users.Username='test'"); 它返回一个结果,$_SESSION['real_name'] 是正确的正在设置
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 2020-04-12
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多