【问题标题】:SQL Query not retrieving proper resultsSQL 查询未检索到正确的结果
【发布时间】:2023-03-25 12:09:01
【问题描述】:

这是我用来确定是否允许用户进入的 login.php 脚本。

<?php

if(isset($_POST['submitted']))
{
 $errors= array();
 $username = ($_POST['username']);
 $pass = ($_POST['pass']);
 $shapass = sha1($pass);
 $_POST['username'] = filter_var($_POST['username'], FILTER_SANITIZE_STRING);
 if ($_POST['username'] == "") {  
   $errors[] = "Please enter your username.";
 }
 if ($_POST['pass'] == "") {  
   $errors[] = "Please enter your password.";
 }

 if(is_array($errors))
 {
    echo '<font color="red"><div align="center" class="error"><span></span><ul>';
    while (list($key,$value) = each($errors))
    {

        echo '<li>'.$value.'</li><br />';
    }echo'</ul></div></font>';
}


if(empty($errors))
{
$user_name = "root";
$password = "";
$database = "rsswebapp";
$server = "127.0.0.1";
$db_handle = mysql_connect($server, $user_name, $password);
$db_found = mysql_select_db($database, $db_handle);
if ($db_found) 
{

$match = "Select ROWID,EMAIL,PWD from `user` ".
    " where (USERNAME='$username' OR EMAIL='$username') and PWD='$shapass' ";
$qry = mysql_query($match);



/*
$uid = isset($_POST['username']) ? $_POST['username'] : $_SESSION['username'];
$pwd = isset($_POST['pass']) ? $_POST['pass'] : $_SESSION['pass'];
*/
$num_rows = mysql_num_rows($qry); 
if ($num_rows <= 0) { 
//unset($_SESSION['uid']);
//unset($_SESSION['pwd']);
header('location:index.php?msg=' . urlencode(base64_encode("Sorry, there is no username                 $username with the specified password.Try again!")));
} 
else 
{
session_start();
$_SESSION['ROWID'] = $sid ;
header("location:dashboard.php");
}
mysql_close($db_handle);
}
else {

print "Database NOT Found ";
mysql_close($db_handle);
}

}   
}   
?>  

如果登录成功,我将用户重定向到dashboard.php

<body>
<div class="container">
  <div id="sidebar">
      <ul>
          <li><a href="dashboard.php?p=categories"><center>Categories</center></a></li>
          <li><a href="dashboard.php?p=myfeeds"><center>My Feeds</center>    </a></li>
          <li><a href="dashboard.php?p=managefeeds"><center>Manage Feeds</center></a>    </li>
          <li><a href="dashboard.php?p=myfeed"><center>Account</center></a></li>
          <li><a href="logout.php"><center>Log Out</center></a></li>
      </ul>
  </div>
  <div class="main-content">
      <div class="swipe-area"></div>
      <a href="#" data-toggle=".container" id="sidebar-toggle">
          <span class="bar"></span>
          <span class="bar"></span>
          <span class="bar"></span>
      </a>
      <div class="content">
          <?php
          session_start();
          $sid = $_SESSION['ROWID'];
          if(!$_SESSION){
          header('location:index.php?msg=' .      urlencode(base64_encode("Please login to continue.")));
          }
          else
          {
          $pages_dir = 'pages';
          if(!empty($_GET['p'])){
          $pages = scandir($pages_dir,0); 
          unset($pages[0],$pages[1]);
          $p = $_GET['p'];
          if(in_array($p.'.php',$pages))
          {
            include($pages_dir.'/'.$p.'.php');
          }
          else
          {
            echo "Sorry, page not found.";
          }
          }

          }

           ?>
           <p></p>
      </div>
  </div>
 </div>
</body>

问题出现在 myfeed.php 中:

<?php 

 $user_name = "root";
 $password = "";
 $database = "rsswebapp";
 $server = "127.0.0.1";
//$db_handle = mysqli_connect($server, $user_name, $password,$database);
$db_handle = new mysqli($server, $user_name, $password,$database);
$db_found = mysqli_select_db( $db_handle,$database);
//session_start();
// $s = mysql_real_escape_string($_SESSION['ROWID']);
//$query = "SELECT  URL,TITLE FROM rssfeeds,user WHERE rssfeeds.USERID=user.ROWID";
// $query = "select GROUP_CONCAT(r.URL) as URL from user as u Left Join rssFeeds as r  On u.ROWID = r.USERID WHERE USERID = $_SESSION";
// $query = "SELECT URL FROM rssfeeds as rss WHERE rss.USERID=$s";
// $query = "SELECT `rssfeeds`.`URL` FROM `rssfeeds` WHERE `rssfeeds`.`USERID`=$_SESSION['ROWID']";
//  $query = "SELECT  URL FROM rssfeeds as rss ,user as userrss WHERE rss.USERID='$sid'";
//$query = "SELECT  rssfeeds.URL FROM rssfeeds LEFT JOIN user ON rssfeeds.USERID=user.ROWID";
 $query = "SELECT URL FROM rssfeeds as rss WHERE rss.USERID='" . $_SESSION["ROWID"] . "'";
//$query = "SELECT URL FROM rssfeeds as rss,user WHERE rss.USERID="$_SESSION['ROWID']"";
// $result = mysqli_query($db_handle,$query);
$result = mysqli_query($db_handle,$query);
// $result = $db_handle->query($query);
 $r = array();
$index = 0;
if($result)
{
echo "BG </br>";
// while($row = mysqli_fetch_assoc($result)) {
  while($row = $result->fetch_array()){
 //  while( ($row = mysql_fetch_assoc($result))!== false){
 //echo "WELL DONE";
 echo "{$row["TITLE"]}  {$row["URL"]} </br>" ;
// $r[$index] = $row["URL"];
// $index++; 
// printf ("%s \n", $row["URL"]);

}
echo "HX";

/*
$yourArray = array(); 
$index=0;
while($row = $result->fetch_array()){
    echo "b";
  //  echo "<a href='".$row["URL"]."'>".$row["TITLE"]."</a>";
   $yourArray[$index] = $row;
 $index++; 
    echo "<br />";print_r($yourArray);
 }
*/  
 }
else
{
 echo "HELLO";
 die(mysql_error());
 }



  ?>

注释掉的语句是我尝试过但不起作用的语句。我无法从数据库表中检索 URL 并将它们显示在页面上。截至目前,我得到的输出为:

背景 HX

我的数据库中有两个表:

  • 用户
  • rssfeeds

'user' 包含四列,即:

  • ROWID(自动递增,主要)
  • 用户名
  • 电子邮件
  • 残疾人

而“rssfeeds”有四个:

  • RSSFEEDID
  • 用户ID
  • 标题
  • 网址

我很确定问题在于 $_SESSION 部分中 myfeed.php 中的查询。

【问题讨论】:

  • 这里需要一些WHERE 子句。如果您在登录后将USERID 存储在某个变量中,您可能甚至不需要加入这些表。
  • @Eggplant 我认为执行 INNER JOIN 与 = 语句完全相同,因为调度程序使用它相同,不是吗?
  • @DavidLevel 它相同是什么?我不是在谈论使用WHERE 子句重写INNER JOIN,而是使用WHERE rssfeeds.USERID = [some_id_here],在这个特定的查询中,JOIN 实际上没有用,因为您没有从“用户”表中选择任何字段。
  • @PriyanshuKumar 您正在寻找的查询是 SELECT URL FROM rssfeeds WHERE USERID = ?; 但如果您 没有足够的 PHP 能力 使用会话变量来存储登录的用户,我建议您在继续项目之前学习语言。干杯。
  • 将 id 存储在会话变量中并不会自动将其用于甚至不出现的查询中!您使用的查询是错误的,即。在此查询 SELECT URL FROM rssfeeds WHERE USERID = ? 中使用此 ID 代替 ?。不要生气,真的,但在开始编码之前,您应该了解 SQL 和 PHP。在学习上投入的每一分钟,你实际上可以节省 10 分钟的学习时间,更不用说结果的质量了;)

标签: php mysql


【解决方案1】:

定义您希望显示 url 的 user_id

$user_id = 1;

运行简单的非连接查询

SELECT
    `rssfeeds`.`URL`
FROM
    `rssfeeds`
WHERE
    `rssfeeds`.`USERID`='$user_id'

如果由于某种原因您还需要用户表中的数据,那么您可以运行此查询

SELECT 
    `rssfeeds`.`URL`
FROM
    `rssfeeds`
    LEFT JOIN `user` ON (`rssfeeds`.`USERID`=`user`.`ROWID`)
WHERE
    `user`.`ROWID`='$user_id'

操作:

我像这样(image)将数据存储在 rssfeeds 中。当我在 phpmyadmin 上运行此查询:SELECT rssfeeds.URL FROM rssfeeds WHERE rssfeeds.USERID=2; 时,我得到类似这样的信息(image)。我不明白的是如何使用 PHP 以单个链接的形式获得此结果。我做了这样的事情(image)谢谢。

$query = "SELECT URL, TITLE FROM rssfeeds as rss WHERE rss.USERID='".$_SESSION['ROWID']."'";
$result = mysql_query($query);
if($result){
    while($row = mysql_fetch_assoc($result)){
        echo "<a href='".$row["URL"]."'>".$row["TITLE"]."</a>";
        echo "<br />";
    }
}

【讨论】:

  • 您的建议不是动态可行的解决方案。用户登录到他的帐户,也可以有新的注册人。这意味着我会不断为每个用户更改我的 PHP 文件。跨度>
  • @PriyanshuKumar 用户登录时,将 user_id 保存为$_SESSION["user_id"] 然后你可以设置$user_id=$_SESSION["user_id"] 我并不是要将你的 user_id 硬编码为$user_id 我只是觉得你已经足够了理解那部分。
  • 怎么做?从数据库检查用户名和密码匹配后,我在登录脚本上设置了$_SESSION["ROWID"] = $sid ;。然后我将用户重定向到他的仪表板页面,这次我设置$sid = $_SESSION['ROWID']; 并检查会话是否存在。如果是这样,我给他一个链接列表,其中一个是提要。如果点击提要,我将他重定向到一个带有类似 url 的页面:vproject/dashboard.php?p=myfeed 我根据他的获取他的提要id 使用查询:$query = "SELECT URL FROM rssfeeds as rss ,user as userrss WHERE rss.USERID='$sid'";,但没有显示任何内容。
  • @PriyanshuKumar 尝试$query = "SELECT URL FROM rssfeeds as rss WHERE rss.USERID='" . $_SESSION['ROWID'] . "'"; 当然你使用session_start();开始会话之后
  • 我将数据存储在 rssfeed 中,如下所示(图片):funkyimg.com/viewer.php?img=/2/4814/772/…。当我运行此 query = SELECT rssfeeds.URL` FROM rssfeeds WHERE rssfeeds.USERID= 2 ;`在 phpmyadmin 上,我得到这样的东西(图片):funkyimg.com/viewer.php?img=/2/4814/786/…。我不明白的是如何使用 PHP 以单个链接的形式获得此结果。我做了这样的事情(图片):funkyimg.com/viewer.php?img=/2/4814/802/… 谢谢。
【解决方案2】:

基于 OP 的新问题的新答案:

以下是调试代码时的一些提示以及我是如何发现问题的:

1) 使用以下代码将php错误报告添加到php文件中:

ini_set('display_errors',1);
error_reporting(E_ALL);

2) 在if 和while/for 循环内回显,查看是否满足条件

3) Echo var_dump() 用于查询时使用变量来查看运行的实际查询是什么:

$query = "SELECT TITLE, URL FROM rssfeeds as rss WHERE rss.USERID='" . $_SESSION["ROWID"] . "'";
echo var_dump($query);
$result = mysqli_query($db_handle,$query);

修复如下:

$num_rows = mysql_num_rows($qry); 
if ($num_rows <= 0) { 
    //unset($_SESSION['uid']);
    //unset($_SESSION['pwd']);
    header('location:index.php?msg=' . urlencode(base64_encode("Sorry, there is no username                 $username with the specified password.Try again!")));
} else {
    session_start();
    $_SESSION['ROWID'] = $sid ;
    header("location:dashboard.php");
}

应该如下:(您之前没有定义$sid,也没有实际从数据库ROWID检索$qry)

if ($num_rows!==1) { 
    header('location:index.php?msg=' . urlencode(base64_encode("Sorry, there is no username $username with the specified password. Try again!")));
} else {
    $row = mysql_fetch_array($qry);
    session_start();
    $_SESSION['ROWID'] = $row['ROWID'] ;
    header("location:dashboard.php");
}

另外,在 myfeed.php 中:

$query = "SELECT URL FROM rssfeeds as rss WHERE rss.USERID='" . $_SESSION["ROWID"] . "'";

应该如下:(尽管您稍后试图在脚本中调用它,但您并没有检索到 TITLE 字段。)

$query = "SELECT TITLE, URL FROM rssfeeds as rss WHERE rss.USERID='" . $_SESSION["ROWID"] . "'";

最后,您回显结果的语法是错误的。以下也在 myfeed.php 中:

if($result)
{
echo "BG </br>";
// while($row = mysqli_fetch_assoc($result)) {
  while($row = $result->fetch_array()){
 //  while( ($row = mysql_fetch_assoc($result))!== false){
 //echo "WELL DONE";
 echo "{$row["TITLE"]}  {$row["URL"]} </br>" ;
// $r[$index] = $row["URL"];
// $index++; 
// printf ("%s \n", $row["URL"]);

}
echo "HX";

应该是:

if($result){
    echo "BG </br>";
    while($row = $result->fetch_array()){
        echo $row["TITLE"]." ".$row["URL"]." </br>" ;
    }
    echo "HX";

最后一点,您在 login.php 中使用 mysql_* 扩展名,但在 myfeeds.php 中使用mysqli_* 扩展名。您应该将所有已弃用扩展名的实例转换为新扩展名。大多数/所有注释代码都可以删除,因为它也不需要。测试这些更改并告诉我它是如何工作的。

【讨论】:

    【解决方案3】:

    用户表:

    CREATE TABLE `User` (
      `ROWID` int(11) NOT NULL,
      `USERNAME` varchar(45) DEFAULT NULL,
      `EMAIL` varchar(45) DEFAULT NULL,
      `PWD` varchar(45) DEFAULT NULL,
      PRIMARY KEY (`ROWID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    

    RssFeeds 表格:

    CREATE TABLE `RssFeeds` (
      `RssfeedId` int(11) NOT NULL,
      `USERID` int(11) NOT NULL,
      `TITLE` varchar(45) DEFAULT NULL,
      `URL` text,
      PRIMARY KEY (`RssfeedId`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    

    用户表中的记录

    mysql> select * from User;
    +-------+----------+-------+------+
    | ROWID | USERNAME | EMAIL | PWD  |
    +-------+----------+-------+------+
    |     1 | a        | a     | a    |
    |     2 | b        | b     | b    |
    |     3 | c        | c     | c    |
    +-------+----------+-------+------+
    3 rows in set (0.00 sec)
    

    RssFeeds 表中的记录

    mysql> select * from RssFeeds;
    +-----------+--------+-------+------+
    | RssfeedId | USERID | TITLE | URL  |
    +-----------+--------+-------+------+
    |         1 |      1 | t1    | u1   |
    |         2 |      1 | t2    | u2   |
    |         3 |      2 | t3    | u3   |
    |         4 |      2 | t4    | u4   |
    +-----------+--------+-------+------+
    4 rows in set (0.00 sec)
    

    RssFeeds 按用户

    mysql> select u.*,r.URL from User as u Left Join RssFeeds as r On u.ROWID = r.USERID;
    +-------+----------+-------+------+------+
    | ROWID | USERNAME | EMAIL | PWD  | URL  |
    +-------+----------+-------+------+------+
    |     1 | a        | a     | a    | u1   |
    |     1 | a        | a     | a    | u2   |
    |     2 | b        | b     | b    | u3   |
    |     2 | b        | b     | b    | u4   |
    |     3 | c        | c     | c    | NULL |
    +-------+----------+-------+------+------+
    5 rows in set (0.00 sec)
    

    使用 GROUP_CONCAT 方法

    mysql> select u.*,GROUP_CONCAT(r.URL) as URL,GROUP_CONCAT(TITLE) as TITLE from User as u Left Join RssFeeds as r On u.ROWID = r.USERID GROUP BY u.ROWID;
    +-------+----------+-------+------+-------+-------+
    | ROWID | USERNAME | EMAIL | PWD  | URL   | TITLE |
    +-------+----------+-------+------+-------+-------+
    |     1 | a        | a     | a    | u1,u2 | t1,t2 |
    |     2 | b        | b     | b    | u3,u4 | t3,t4 |
    |     3 | c        | c     | c    | NULL  | NULL  |
    +-------+----------+-------+------+-------+-------+
    3 rows in set (0.01 sec)
    

    针对特定用户:

    mysql> select u.*,GROUP_CONCAT(r.URL) as URL,GROUP_CONCAT(TITLE) as TITLE from User as u Left Join RssFeeds as r On u.ROWID = r.USERID WHERE ROWID = 1;
    +-------+----------+-------+------+-------+-------+
    | ROWID | USERNAME | EMAIL | PWD  | URL   | TITLE |
    +-------+----------+-------+------+-------+-------+
    |     1 | a        | a     | a    | u1,u2 | t1,t2 |
    +-------+----------+-------+------+-------+-------+
    1 row in set (0.00 sec)
    

    【讨论】:

    • 所以你建议在 'rssfeeds' 表中增加一个应该作为主键的列?
    • 如果RssFeedstable 中没有RssfeedId 列,它也可以工作。但是,为简单起见,每个表都有自己的 PK。它不是强制性的。
    猜你喜欢
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多