3

私は PHP/MySQL にかなり慣れていないので、初心者の問題を抱えているようです。

次のコードは、何を変更してもエラーが発生し続けます。構文のどこかに問題があると感じています。それはすべて自宅の「localhost」で機能しましたが、オンラインでホストしようとしているので、スペースなどではるかに気まぐれになっているようです。

これは単純なログイン システムで、問題のコードは次のとおりです。

<?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_*、LOL、私もそれを修正します。

4

2 に答える 2

3

usernameバックティックを使用して列名をエスケープする必要があります。

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

あなたのコードはSQL インジェクションの影響を受けやすいです。PDOまたはMYSQLIを使用する

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

Sean、次のように、変数の周りにドットを使用する必要があります。

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

このようにコードを使用すると、SQL インジェクションに対して脆弱になります。SQL インジェクションを防ぐためにデータベースにデータを挿入する際にmysql_real_escape_stringを使用することを強くお勧めします。迅速な解決策として、またはPDOまたはMySQLiを使用することをお勧めします。

またmysql_*、データベースへの接続に使用している場合は、関数に関する PHP マニュアルの章を読むことをお勧めします。この章ではmysql_*、この拡張機能は新しいコードの作成には推奨されないことが指摘されています。代わりに、 MySQLiまたはPDO_MySQL拡張機能のいずれかを使用する必要があると彼らは言います。

編集:

また、あなたmysql_connectをチェックしたところ、奇妙な規則性が見つかりました.on引数を使用"するmysql_connectと、接続に失敗し、私の場合、私があなたのためにテストしていたときに、説明した方法で発生したので、代わりにこれを試してください:

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

PHPマニュアルの例に示されているように置き換え"てみてください。うまくいくと思います!'

それでもうまくいかない場合は$rowprint_r($row);直後に print を使用して、配列または変数$sql=mysql_query()にあるものを確認してください。$row

于 2012-09-09T10:05:45.657 に答える