【问题标题】:Error in logic PHP / SQL Server逻辑 PHP / SQL Server 中的错误
【发布时间】:2011-04-17 20:48:52
【问题描述】:

我有一个逻辑错误,我一生都无法弄清楚。问题是我写的这个非常非常基本的登录页面总是输出默认答案,而不是表中的选择。

我正在尝试将E_Type 中的值返回给 php,在这种情况下,该值应该返回 A,但事实并非如此。

我做错了什么?

代码:

<?php
$server   = -Removed;
$login    = -Removed;            
$pass     = -Removed;        
$login    = $_POST['login'];
$password = $_POST['password'];
$table    = 'USERPASS';
$table2   = 'EMPLOYEES';
$res      = 'q';

$dblink = @mssql_connect(-Removed) or die("Error 1");
mssql_select_db('group5', $dblink) or die( "unable to select the database");

$sqlquery = "SELECT E_TYPE FROM USERPASS U, EMPLOYEES E WHERE U.EMPLOYEE_ID = E.EMPLOYEE_ID AND PASSWORD = '$password' AND USERNAME = '$login'";
$res = mssql_query($sqlquery, $dblink) or die("Error5");
$count = mssql_num_rows($res);

if($count==1)
{
    if ($res == "A" )
    {
        echo "Success 1";
    }
    else if ($res == "B" )
    {
        echo "Success 2";
    }
    else
    {
        echo "Error...";
    }
}
?>

【问题讨论】:

  • 你到底想做什么,用 1 行解释
  • 这个脚本的输出是什么?

标签: php sql sql-server logic


【解决方案1】:

您需要先获取结果。在$res 中,您基本上只有一个可以迭代结果的结果句柄。

使用mssql_fetch_assoc 获取结果并访问它们(这将遍历所有结果行):

while(($row = mssql_fetch_assoc($res)) !== FALSE) {
    echo $row['E_TYPE'];
}

在你的情况下(如果你只期望一行)使用这个:

if($count == 1) {
    $row = mssql_fetch_assoc($res);
    if ($row['E_TYPE'] == "A" )
    {
        echo "Success 1";
    }
    else if ($row['E_TYPE'] == "B" )
    {
        echo "Success 2";
    }
    else {
        echo "Error...";
    }

}

【讨论】:

    【解决方案2】:

    mssql_query 返回 MS SQL 结果集,要获得返回值,你必须先从这个结果集中获取行。请参阅http://www.php.net/manual/en/function.mssql-fetch-assoc.php 和其他 mssql_fetch 函数

    【讨论】:

      【解决方案3】:
      <?php
      $server = -Removed;
      $login = -Removed;           
      $pass = -Removed;        
      $login=$_POST['login'];
      $password=$_POST['password'];
      $table= 'USERPASS';
      $table2='EMPLOYEES';
      $res='q';
      
      $dblink = @mssql_connect(-Removed) or die("Error 1");
      mssql_select_db('group5', $dblink) or die( "unable to select the database");
      $sqlquery = "SELECT E_TYPE FROM USERPASS U, EMPLOYEES E WHERE U.EMPLOYEE_ID = E.EMPLOYEE_ID AND PASSWORD = '$password' AND USERNAME = '$login'";
      $res = mssql_query($sqlquery, $dblink) or die("Error5");
      $count=mssql_num_rows($res);
          if(1 == $count){
              $row=mssql_fetch_assoc($res);//fetch row from database
              switch($row['E_TYPE']) {
                  case "A":
                      echo "Success 1"; 
                      break;
                  case "B":
                      echo "Success 2"; 
                      break;
                  default:
                      echo "Error..."; 
                      break;
              }
          }
      }
      mssql_free_result($res);
      ?>
      

      您应该了解 select...case 语句。 我唯一能看到的是你的角色的情况。数据库可能区分大小写,也可能不区分大小写。 您还缺少一些有时会影响您的结果的东西:mysql_free_result()。 您通常应该针对获取行而不是 if 执行 while 语句,因为可能有超过 1 行。

      我通常将常量放在比较运算符之前,并且在可能且有意义的情况下将变量放在右侧,因为如果在任何情况下由于缺少 = 而成为赋值,编译器会捕获错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-29
        • 2021-04-28
        • 2012-01-03
        • 1970-01-01
        • 1970-01-01
        • 2019-03-29
        • 2015-10-14
        • 1970-01-01
        相关资源
        最近更新 更多