PHP页面中的sqlsrv_query MS SQL错误

时间:2018-10-26 16:56:45

标签: php sql-server

大家好:

我无法为我的PHP应用程序建立一个登录页面,并连接到MS SQL Server数据库。

我可以使用以下代码连接到数据库:

<?php
$serverName = "DESKTOP-FDJAOMJ\\sqlexpress"; //serverName\instanceName
$connectionInfo = array( "Database"=>"sgo", "UID"=>"arm", "PWD"=>"arm123");
$con = sqlsrv_connect( $serverName, $connectionInfo);

if( $con ) {
     echo "Connection established.<br />";
}else{
     echo "Connection could not be established.<br />";
     die( print_r( sqlsrv_errors(), true));
}
?>

然后连接正常。但是,我只使用过MySQL后端,并且该项目需要MS SQL,但我无法使MS SQL登录页​​面正常工作。我的代码如下:

<!DOCTYPE html>
<html>
    <body>
        <?php
        require('db.php');
        session_start();
        // If form submitted, insert values into the database.
        if (isset($_POST['username'])){
                // removes backslashes
            $username = stripslashes($_REQUEST['username']);
                //escapes special characters in a string
            //$username = unpack($con,$username);
            $password = stripslashes($_REQUEST['password']);
            //$password = addslashes($con,$password);
            //Checking is user existing in the database or not
            $query = "SELECT * FROM `users` WHERE username='$username' and password='$password'";
            $params = array();
            $result = sqlsrv_query($con,$query,$params) or die(sqlsrv_errors());
            $rows = sqlsrv_num_rows($result);
                if($rows==1){
                $_SESSION['username'] = $username;
                    // Redirect user to index.php
                header("Location: index.php");
                 }else{
            echo "<div class='form'>
        <h3>Username/password is incorrect.</h3>
        <br/>Click here to <a href='login.php'>Login</a></div>";
            }
            }else{
        ?>
        <div class="form">
            <h1>Log In</h1>
            <form action="" method="post" name="login">
                <input type="text" name="username" placeholder="Username" required />
                <input type="password" name="password" placeholder="Password" required />
                <input name="submit" type="submit" value="Login" />
            </form>
            <p>Not registered yet? <a href='registration.php'>Register Here</a></p>
        </div>
        <?php } ?>
    </body>
</html>

输入用户名和密码时出现错误:

  

注意:C:\ wamp \ www \ PHPwebpage \ login.php中的数组到字符串的转换   在第18行上。第18行是“” $ result = sqlsrv_query($ con,$ query,$ params)   或die(sqlsrv_errors());“”。

users表变量: id int 用户名varchar(50) 电子邮件varchar(100) 密码varchar(50) trn_date datetime

3 个答案:

答案 0 :(得分:2)

尽管我不是SQL Server编码器,但是您仍需要更改一些内容...

    $query = "SELECT * FROM [users] WHERE username='$username' and password='$password'";
    $params = array();
    $result = sqlsrv_query($con,$query,$params) or die( print_r( sqlsrv_errors(), true));

在MySQL中,您可以在表名和列名中使用反引号,但不能在SQL Server中使用-如Parfait在注释中所指出的,应将[]用作保留字。

由于错误,您得到-sqlsrv_errors()返回一个数组,因此我将die()更改为放出print_r( sqlsrv_errors(), true)

我还建议研究准备好的语句以避免SQL注入,而password_hash()则建议改进密码处理。

答案 1 :(得分:1)

当前,您正在将一个空数组$params传递到sqlserv_query()中,而不在准备好的语句中使用qmark ?占位符来绑定参数值。

请考虑修改参数设置并使用try/catch,不要向用户显示网页上的实际错误。下面将引发log files中的错误。

$username = stripslashes($_REQUEST['username']);
$password = stripslashes($_REQUEST['password']);

//Checking is user existing in the database or not
$query = "SELECT * FROM [users] WHERE username = ? and password = ?";
$params = array($username, $password);

try {
   $result = sqlsrv_query($con, $query, $params);
} catch(Exception $e) {
   error_log("$e");
}

答案 2 :(得分:1)

  1. 通过SSMS的ALT + F1检查表中具有列名的用户名
  2. 您是否已连接到正确的数据库(可能在其他地方被覆盖)
  3. 在表名之前使用架构名,如下所示

    $query = "SELECT * FROM dbo.[users] WHERE username='$username' and password='$password'";