3

我对 PHP/MySQL 还很陌生,我似乎遇到了新手问题。

无论我进行什么更改,以下代码都会不断向我抛出错误,而且我感觉它一定是在我搞砸的语法中的某个地方。这一切都在家里“本地主机”工作,但现在我试图在网上托管它,它似乎对空间和诸如此类的东西更有气质。

这是一个简单的登录系统,问题代码如下:

<?php
session_start();
require 'connect.php';
echo "Test";

//Hash passwords using MD5 hash (32bit string).
$username=($_POST['username']);
$password=MD5($_POST['password']);

//Get required information from admin_logins table
$sql=mysql_query("SELECT * FROM admin_logins WHERE Username='$username' ");
$row=mysql_fetch_array($sql);

//Check that entered username is valid by checking returned UserID
if($row['UserID'] === NULL){
    header("Location: ../adminlogin.php?errCode=UserFail");
}
//Where username is correct, check corresponding password
else if ($row['UserID'] != NULL && $row['Password'] != $password){
    header("Location: ../adminlogin.php?errCode=PassFail");
}
else{
    $_SESSION['isAdmin'] = true;
    header("Location: ../admincontrols.php");
}

mysql_close($con);

?>

测试就在那里,所以我知道为什么页面会抛出错误,即:

`Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in 'THISPAGE' on line 12`

它似乎不喜欢我的 SQL 查询。

任何帮助深表感谢。

编辑:

connect.php页面是:

<?php
$con = mysql_connect("localhost","username","password");
if(!$con) {
    die('Could not connect: ' . mysql_error());
}
    mysql_select_db("dbname", $con);
?>

是的mysql_*,哈哈,我也会解决这个问题的。

4

2 回答 2

3

您应该使用反引号转义列名username,尝试

SELECT * 
FROM admin_logins 
WHERE `Username` = '$username'

您的代码很容易发生SQL 注入。使用PDOMYSQLI

使用 PDO 扩展的示例:

<?php
$stmt = $dbh->prepare("SELECT * FROM admin_logins  WHERE `Username` = ?");
$stmt->bindParam(1, $username);
if ($stmt->execute(array($_GET['name']))) {
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
}
?>
于 2012-09-09T10:06:21.983 回答
2

肖恩,您必须在变量周围使用点,如下所示:

$sql = mysql_query("SELECT * FROM admin_logins WHERE Username = '". mysql_real_escape_string($username)."' ");

如果你像这样使用你的代码,那么它很容易受到 SQL 注入的攻击。我强烈建议您在将数据插入数据库时​​使用mysql_real_escape_string以防止SQL 注入,作为一种快速解决方案或更好地使用PDOMySQLi

此外,如果您用于mysql_*连接到数据库,那么我建议您阅读有关mysql_*函数的 PHP 手册章节,他们指出,不建议使用此扩展来编写新代码。相反,他们说,您应该使用MySQLiPDO_MySQL扩展。

编辑:

我还检查了你的mysql_connect,发现了一个奇怪的规律,那就是 - 如果你"mysql_connect参数上使用,那么它无法连接,在我的情况下,当我为你测试它时,它发生的只是描述的方式,所以,请试试这个:

$con = mysql_connect('localhost','username','password');

尝试替换"PHP 手册'示例中显示的那样,我认为它会起作用!

如果它仍然不起作用,只需 print $rowprint_r($row);然后$sql=mysql_query()查看$row数组或变量上的内容。

于 2012-09-09T10:05:45.657 回答