大家好:
我无法为我的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
答案 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)
在表名之前使用架构名,如下所示
$query = "SELECT * FROM dbo.[users] WHERE username='$username' and password='$password'";