mysql_fetch_array()/ mysql_fetch_assoc()/ mysql_fetch_row()/ mysql_num_rows etc…は、パラメータ1がリソースであることを期待しています


960

MySQLテーブルからデータを選択しようとしていますが、次のいずれかのエラーメッセージが表示されます。

mysql_fetch_array()は、パラメーター1がリソースであることを期待し、ブール値が与えられます

これは私のコードです:

$username = $_POST['username'];
$password = $_POST['password'];

$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

while($row = mysql_fetch_array($result)) {
    echo $row['FirstName'];
}

15
次のコマンドを使用すると、より便利なeroorメッセージを取得できます。:QUERYまたはdie(mysql_error());
nik

123
また、必須の注記:コードにはSQLインジェクションが発生する傾向がありますユーザー入力を検証またはエスケープする必要があります。見てくださいmysql_real_escape_stringユーザーデータを信頼しないでください。
Felix Kling

7
実際、OPのコードはMySQLサーバーで構文エラーを引き起こしますが、少なくとも単一引用符には変数補間がないため、SQLインジェクションに対して脆弱ではありません。
szgal 14

4
@FelixKling私はこれが非常に古く、その時点でおそらく最も正確であることに気づきますが、あなたのコメントは、ある意味で危険なほど間違っていmysql_real_escape_stringます。それでも多くの攻撃に対して脆弱です。(いいえ、それが完璧だと言ったことはありませんが、それが唯一の必要なソリューションであると示唆していました)私が知る限り、現在の最良のソリューションはPDOです。
モニカの訴訟に資金を提供

2
ああ。この質問をMySQLiとPDOを含めるように拡張することは悪い考えでした。それぞれに独自のわずかに異なる構文とエラーメッセージがあり、完全に独自の質問があったかもしれません。すべてを1つの巨大な3部構成の質問に組み合わせると、Googleでの操作性が低下し、ここに到着したユーザーは無関係なコンテンツをたどって目的の内容にたどり着きます。また、以下の非常に多くの回答が無効になり、この質問は、私たちが通常適用する基準で「Too Broad」になります。私の意見では混乱していますが、今修正するには遅すぎます。
Mark Amery

回答:


667

クエリはさまざまな理由で失敗する可能性があります。その場合、mysql_ *とmysqli拡張の両方falseがそれぞれのクエリ関数/メソッドから返されます。そのエラー状態をテストし、それに応じて処理する必要があります。

mysql_ *拡張

NOTE mysql_関数は廃止されましたし、PHPのバージョン7で削除されました。

$resultに渡す前に確認してくださいmysql_fetch_arrayfalseクエリが失敗したことが原因であることがわかります。mysql_query可能な戻り値とそれらの処理方法に関する提案については、ドキュメントを参照してください。

$username = mysql_real_escape_string($_POST['username']);
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

if($result === FALSE) { 
    die(mysql_error()); // TODO: better error handling
}

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

mysqli拡張
手続き型

$username = mysqli_real_escape_string($mysqli, $_POST['username']);
$result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'");

// mysqli_query returns false if something went wrong with the query
if($result === FALSE) { 
    yourErrorHandler(mysqli_error($mysqli));
}
else {
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
        ...

oo-style

$username = $mysqli->escape_string($_POST['username']);
$result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'");

if($result === FALSE) { 
    yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else {
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
      ...

準備されたステートメントを使用する:

$stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?');
if ( !$stmt ) {
    yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else if ( !$stmt->bind_param('s', $_POST['username']) ) {
    yourErrorHandler($stmt->error); // or $stmt->error_list
}
else if ( !$stmt->execute() ) {
    yourErrorHandler($stmt->error); // or $stmt->error_list
}
else {
    $result = $stmt->get_result();
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
      ...

これらの例は説明するだけです それを行う方法、(エラー処理)行われるべきではありません。or dieHTMLを出力するときにプロダクションコードを使用しないでください。使用すると、(少なくとも)無効なHTMLが生成されます。また、データベースのエラーメッセージは情報が多すぎるため、管理者以外のユーザーには表示しないでください


9
正しいですが、クエリが失敗した場合にdie()を使用するのは少しだけです。
2ndkauboy

28
OPのエラー処理メカニズム全体を設計するつもりでしたが、それは私の回答の範囲を超える可能性があると判断しました。
Edward Dale

@ scompt.comはい、他のいくつかの回答でも説明されています。これは高視認性の質問で受け入れられた回答であるため、将来のエラーを適切にキャッチする方法に関する(優れた)アドバイスに加えて、実際に特定の質問(IMHO)に回答する必要がある(つまり、この場合エラーが発生する理由を説明してください)。
Sepster 2013

2
代わりにif($result === FALSE)を使用できますif(! $result)。私が間違っている場合は私を修正してください
anestv 2014年

1
mysql_query():mysql拡張は非推奨であり、将来削除される予定です:mysqliを使用してください
Greg

165

このエラーメッセージは、クエリでエラーが発生して失敗した場合に表示されます。使用すると次のようになります。

  • mysql_fetch_array/mysqli_fetch_array()
  • mysql_fetch_assoc()/mysqli_fetch_assoc()
  • mysql_num_rows()/mysqli_num_rows()

:クエリの影響を受ける行がない場合、このエラーは表示されませ。無効な構文のクエリのみがこのエラーを生成します。

トラブルシューティングの手順

  • すべてのエラーを表示するように開発サーバーが構成されていることを確認してください。これは、ファイルの上部または構成ファイルに配置することで実行できますerror_reporting(-1);。構文エラーがある場合、これはそれらを指摘します。

  • を使用しmysql_error()ます。mysql_error()MySQLがクエリの実行中に発生したエラーを報告します。

    使用例:

    mysql_connect($host, $username, $password) or die("cannot connect"); 
    mysql_select_db($db_name) or die("cannot select DB");
    
    $sql = "SELECT * FROM table_name";
    $result = mysql_query($sql);
    
    if (false === $result) {
        echo mysql_error();
    }
  • MySQLコマンドラインまたはphpMyAdminなどのツールからクエリを実行します。クエリに構文エラーがある場合は、それが何であるかがわかります。

  • あなたの引用が正しいことを確認してください。クエリまたは値を囲む引用符がないと、クエリが失敗する可能性があります。

  • 値をエスケープしていることを確認してください。クエリで引用符を使用すると、クエリが失敗する可能性があります(SQLインジェクションを開いたままにします)。mysql_real_escape_string()入力をエスケープするために使用します。

  • ミキシングmysqli_*mysql_*機能がないことを確認してください。それらは同じものではなく、一緒に使用することはできません。(どちらかを選択する場合は、mysqli_*。理由については以下を参照してください。)

その他のヒント

mysql_*関数を新しいコードに使用しないでください。それらはもはや維持されておらず、コミュニティは廃止プロセスを開始しています。代わりに、準備済みステートメントについて学習し、PDOまたはMySQLiを使用する必要があります。決定できない場合は、この記事を参考にしてください。あなたが学びたいなら、ここに良いPDOチュートリアルがあります。


1
今日この質問を考えると、最近、stackoverflow.com / q / 43804651/1415724と他の同様の質問があります。/でクエリを実行しないことによってもエラーが発生する可能mysql_query()mysqli_query($connection)性があるなどのように回答を更新することは価値があると思います; 考え?このQ&Aの他の回答ではこれについて言及していません。
ファンクフォーティニナー2017

111

ここで発生したエラーは、単一引用符(')の使用が原因でした。あなたはこのようにクエリを置くことができます:

mysql_query("
SELECT * FROM Users 
WHERE UserName 
LIKE '".mysql_real_escape_string ($username)."'
");

これは、使っているmysql_real_escape_stringSQLインジェクションの防止のために。アップグレードされたバージョンのPHP(PHP 5.5.0以降)にはMySQLiまたはPDO_MYSQL拡張機能を使用する必要がありますが、古いバージョンでmysql_real_escape_stringはこれでうまくいきます。


5
クエリ文字列に変数を配置するだけでなく、文字列連結でノイズを追加するのはなぜですか?
Matteo Riva

1
@Matteo Rivaええ、でも、これは文字列から変数を分離するための少しすっきりした方法だと思いました。:)
nik

60

以下のようscompt.comを説明し、クエリが失敗することがあります。次のコードを使用して、クエリのエラーまたは正しい結果を取得します。

$username = $_POST['username'];
$password = $_POST['password'];

$result = mysql_query("
SELECT * FROM Users 
WHERE UserName LIKE '".mysql_real_escape_string($username)."'
");

if($result)
{
    while($row = mysql_fetch_array($result))
    {
        echo $row['FirstName'];
    }
} else {
    echo 'Invalid query: ' . mysql_error() . "\n";
    echo 'Whole query: ' . $query; 
}

詳細については、ドキュメントをmysql_query()参照してください。

実際のエラーは一重引用符でしたので、変数$usernameは解析されませんでした。ただしmysql_real_escape_string($username)、SQLインジェクションを回避するには、実際に使用する必要があります。


52

引用符で囲みます$username。数値ではなく、文字列値は引用符で囲む必要があります。

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

また、LIKEワイルドカードを使用しない場合は条件を使用しても意味がありません。完全一致が必要な場合は、の=代わりに使用してくださいLIKE


1
また、$ usernameが "'; DROP TABLES;"の場合はどうでしょうか。?これは、準備されたステートメントとバインドされた値を使用することの利点です。
HoldOffHunger 2016年

42

データベースが選択されていない場合があるため、選択されたデータベースが選択されていないことを確認してください。

小切手

mysql_select_db('database name ')or DIE('Database name is not available!');

MySQLクエリの前に、次のステップに進む

$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

f($result === FALSE) {
    die(mysql_error());

40

あなたのコードはこのようなものでなければなりません

$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM Users WHERE UserName LIKE '$username'";
echo $query;
$result = mysql_query($query);

if($result === FALSE) {
    die(mysql_error("error message for the user")); 
}

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

これを完了すると、クエリが画面に表示されます。サーバーでこのクエリを試して、望ましい結果が得られるかどうかを確認してください。ほとんどの場合、エラーはクエリにあります。コードの残りの部分は正しいです。


3
このコードは使用しないでください。SQLインジェクション攻撃に対して広く開かれています。
ブラッド

34
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

単一引用符を使用して文字列を定義すると、PHPは単一引用符で区切られた文字列を解析しません。変数補間を取得するには、二重引用符または文字列連結(またはそれらの組み合わせ)を使用する必要があります。詳細については、http://php.net/manual/en/language.types.string.phpを参照してください。

また、mysql_queryが有効な結果リソースを返したことを確認する必要があります。そうしないと、fetch _ *、num_rowsなどが結果ではないため、結果に対して機能しません。IE:

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

if( $result === FALSE ) {
   trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR);
} else {
   while( $row = mysql_fetch_array($result) ) {
      echo $row['username'];
   }
}

詳細については、http://us.php.net/manual/en/function.mysql-query.phpをご覧ください。


2
引用符を追加しても、このコードは使用しないでください。SQLインジェクション攻撃に対して広く開かれています。
ブラッド

33

このクエリは機能するはずです。

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

問題は一重引用符であるため、クエリは失敗し、FALSEを返し、WHILEループは実行できません。%を使用すると、文字列を含むすべての結果(SomeText- $ username-SomeTextなど)を照合できます。

これは単にあなたの質問への答えです。他の投稿で述べたものを実装する必要があります:エラー処理、エスケープ文字列の使用(ユーザーはフィールドに何でも入力でき、任意のコードではないことを確認する必要があります)、mysql_connectの代わりにPDOを使用してくださいこれは現在低価格です。


28
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'") or die(mysql_error());

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

時々クエリを抑制する @mysql_query(your query);


2
このコードは使用しないでください。SQLインジェクション攻撃に対して広く開かれています。
Brad

27

ここですべてを試してもうまくいかない場合は、MySQLデータベースの照合順序を確認してください。私はスウェーデンの照合に設定されました。それから私はそれを変更しutf8_general_ci、すべてがギアにカチッとはまりました。


25
$query = "SELECT Name,Mobile,Website,Rating FROM grand_table order by 4";

while( $data = mysql_fetch_array($query))
{
    echo("<tr><td>$data[0]</td><td>$data[1]</td><td>$data[2]</td><td>$data[3]</td></tr>");      
}

WHEREクエリを使用する代わりに、このORDER BYクエリを使用できます。クエリを使用するには、これよりもはるかに優れています。

私はこのクエリを実行しましたが、パラメーターやブール値のようなエラーは発生していません。


htmlspecialchars()HTMLのコンテキストで任意のデータを使用する場合は、必ず使用してください。そうしないと、データで予約文字が使用されているときに有効なHTMLが作成される危険があります。
Brad

25

これを試してください、それはうまくいくはずです、そうでなければあなたはあなたの問題を特定するためにエラーを印刷する必要があります

$username = $_POST['username'];
$password = $_POST['password'];

$sql = "SELECT * from Users WHERE UserName LIKE '$username'";
$result = mysql_query($sql,$con);

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

8
1)SQLインジェクションへのオープンなオープン、2)OPの場合にエラーを引き起こしているエラー処理が含まれていません。
だます

+1。@decezeはい、オープンです。しかし、OPや受け入れられた回答者のコードがそれ以上にならないようにしてください;-)そして、OPのコードにエラー処理が含まれていないことがエラーの原因ではありません... エラーであり、この回答は少なくとも(単一のLIKE式内の文字列リテラルを引用符で囲みます)。
Sepster 2013

1
+1 LIKEと '$ username'の間にスペースを追加してください。SQLインジェクションを除いて、残りは問題ないようです。LIKE演算子の代わりに=を使用しない理由ユーザー名は正確に一致する必要があります
asim-ishaq

21

2つの理由が考えられます。

  1. mysql_query関数を呼び出す前にデータベースへの接続を開いていますか?私はあなたのコードにそれを見ません。クエリを行う前にmysql_connectを使用します。見るphp.net/manual/en/function.mysql-connect.php

  2. 変数$ usernameは単一引用符文字列内で使用されるため、その値はクエリ内では評価されません。クエリは間違いなく失敗します。

第三に、クエリの構造はSQLインジェクションを起こしやすいです。このセキュリティ上の脅威を回避するために、準備されたステートメントを使用できます。


20

次のコードを試してください。正常に動作する可能性があります。

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'");

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

4
このコードはSQLインジェクションの影響を受けるため、使用しないでください。
ブラッド

15

に移動しますconfig.php。私も同じ問題を抱えていました。ユーザー名とパスワードを確認します。また、sql selectは構成と同じ名前です。


15

depricated mysql_ *関数を使用しないでください(php 5.5でdepricatedはphp 7で削除されます)。あなたはこれをmysqliまたはpdoで作ることができます

これが完全な選択クエリです

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        // code here 
    }
} else {
    echo "0 results";
}
$conn->close();
?>

あなたの投稿は、無効なクエリと不十分なエラー報告である質問によって対処された問題を扱いません。この投稿はトピックから外れています。
Paul Spiegel

14
<?php
    $username = $_POST['username'];
    $password = $_POST['password'];
    $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".$username."'");

    while($row = mysql_fetch_array($result))
    {
        echo $row['FirstName'];
    }
?>

また、一意のユーザー名を持つユーザーがいる場合は、「=」を使用できます。好きになる必要はありません。

クエリは次のようになります。

mysql_query("SELECT * FROM Users WHERE UserName ='".$username."'");

3
このコードはSQLインジェクションに対して広く開かれており、使用しないでください。
Brad

@AnujGargこのコードは直接入力を受け取り、それをクエリに連結します。誰かが自分のSQLを投稿データに書き込むことができusername、それが実行されます。
ブラッド

それでは、SQLインジェクションからコードを防ぐために何を使用するのでしょうか。
Anuj Garg

14

MySQLクエリの前に接続文字列変数を含めます。たとえば$connt、次のコードでは:

$results = mysql_query($connt, "SELECT * FROM users");

1
これは問題の問題に対処していません。これも誤りであり、別のエラーが発生します。
Paul Spiegel

12

いつでも...

「警告:mysqli_fetch_object()はパラメーター1がmysqli_resultであると想定しています。ブール値が指定されています」

...クエリに問題がある可能性があります。prepare()またはquery()返されることがありますFALSE(ブール値)が、この一般的なエラーメッセージは、多くの手がかりの方法であなたを残していません。クエリのどこが悪いのかをどのようにして見つけますか?あなたが尋ねる

まず、エラー報告がオンになっていて表示されていることを確認します。これらの2行を、ファイルを開いた直後にファイルの先頭に追加します <?phpタグの。

error_reporting(E_ALL);
ini_set('display_errors', 1);

エラー報告がphp.iniで設定されている場合、これについて心配する必要はありません。エラーを適切に処理し、問題の真の原因をユーザーに明らかにしないようにしてください。本当の原因を公に明らかにすることは、あなたのサイトやサーバーに危害を加えたいと思っている人にとって、金の彫刻が施された招待状になる可能性があります。ブラウザにエラーを送信したくない場合は、いつでもWebサーバーのエラーログを監視できます。ログの場所はサーバーによって異なります。たとえば、Ubuntuではエラーログは通常次の場所にあります/var/log/apache2/error.logます。Linux環境でエラーログを調査している場合tail -f /path/to/logは、コンソールウィンドウで使用して、リアルタイムで発生したエラーを確認したり、エラーを確認したりできます。

標準エラーレポートに慣れてきたら、データベース接続とクエリにエラーチェックを追加すると、進行中の問題についてより詳細な情報が得られます。列名が正しくないこの例を見てください。まず、一般的な致命的なエラーメッセージを返すコード:

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();

エラーは一般的なものであり、何が起こっているのかを解決するうえであまり役に立ちません。

さらに数行のコードを使用すると、問題をすぐに解決するために使用できる非常に詳細な情報を取得できます。prepare()ステートメントが真実かどうかを確認し、正しければバインドと実行に進むことができます。

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
    $query->bind_param('s', $definition);
    $query->execute();
    // any additional code you need would go here.
} else {
    $error = $mysqli->errno . ' ' . $mysqli->error; // 1054 Unknown column 'foo' in 'field list'
    // handle error
}

何か問題がある場合は、問題に直接移動するエラーメッセージを出力できます。この場合、foo表には列がありません。問題を解決するのは簡単です。

必要に応じて、このチェックを関数またはクラスに組み込み、前述のようにエラーを適切に処理することで拡張できます。


2
「エラーを適切に処理し、問題の真の原因をユーザーに明らかにしないようにしてください」とどのように書けますか?そしてecho $error;1つの投稿で?
Paul Spiegel

頭を上げてくれてありがとう@PaulSpiegel。答えを書いたり、もう一度読んだりして、久しぶりにそこにエコーが残っているのを見逃していました。
ジェイブランチャード

11
<?php
      $username = $_POST['username'];
       $password = $_POST['password'];

     $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string($username)."'")or die(mysql_error());
while($row=mysql_fetch_array($result))
  {
 echo $row['FirstName'];
 }
 ?>

11

これを試して

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysqli_query('SELECT * FROM Users WHERE UserName LIKE $username');

if($result){
while($row = mysqli_fetch_array($result))
{
    echo $row['FirstName'];
}
}

4
@panjehra mysql_ *は廃止され、php 7から削除されます。代わりにmysqli_ *を使用してください
Manoj Kumar

9

まず、データベースへの接続を確認します。正常に接続されていますか?

それが終わったら、その後このコードを書いて、うまくいきます:

if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) {
    $Q1mrks = $_GET['q1mrks'];
    $marks = $_GET['marks'];
    $qt1 = $_GET['qt1'];

    $qtype_qry = mysql_query("
        SELECT *
        FROM s_questiontypes
        WHERE quetype_id = '$qt1'
    ");
    $row = mysql_fetch_assoc($qtype_qry);
    $qcode = $row['quetype_code'];

    $sq_qry = "
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        ORDER BY RAND() LIMIT $Q1mrks
    ";
    $sq_qry = mysql_query("
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        LIMIT $Q1mrks
    ");
    while ($qrow = mysql_fetch_array($sq_qry)) {
        $qm = $qrow['marks'] . "<br />";
        $total += $qm . "<br />";
    }
    echo $total . "/" . $marks;
}

2
このコードは使用しないでください。SQLインジェクション攻撃に対して広く開かれています。
Brad

9

クエリを実行する前にdb_close()を使用してデータベースを閉じていないことを確認します。

スクリプトで複数のクエリを使用している場合でも、クエリまたはデータベース接続を含む他のページを含めている場合は、データベース接続を閉じるdb_close()をどこでも使用できる可能性があります。スクリプトでこの間違いをしないでください。


8

チェック中にMySQLエラーが表示されない場合は、データベーステーブルが適切に作成されていることを確認してください。これは私に起こりました。不要なコンマや引用符を探します。


7

まず接続を確認してください。

次に、データベースから正確な値をフェッチする場合は、次のように記述する必要があります。

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName =`$usernam`");

またはLIKE、値のタイプをフェッチしたい場合は、次のように記述する必要があります。

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");

3
このコードはSQLインジェクションに対して広く開かれており、使用しないでください。
ブラッド

6

$resultフェッチ配列を実行する前に、そのように失敗している かどうかを確認することもできます

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
if(!$result)
{
     echo "error executing query: "+mysql_error(); 
}else{
       while($row = mysql_fetch_array($result))
       {
         echo $row['FirstName'];
       }
}

3
このコードは使用しないでください。SQLインジェクション攻撃に対して広く開かれています。
Brad

しかし、コードが機能する場合は、コードをキャストする代わりに、コードを編集して必要なフィルターを入力する必要があると思います。
user28864 14

フィルターを単純に使用しても、このコードの問題は修正されません。最良の解決策は、PDOまたは同様のもので準備済み/パラメーター化されたクエリを使用することです。正解はすでにここに掲載されているので、修正する意味はないと思います。理想的には、この回答は削除されます。ただし、回答を修正していただいてもかまいません。正しければ、喜んで投票します。
Brad

まあ、もし答えが検討に値しないと感じたら、先に進んでそれを読むことができます。しかし、私はこのコミュニティの核心は知識を共有し貢献することだと思いました。人を見せびらかすのではなく、共有する何かがある場合。
user28864 14

2
あなたは正しいです、このコミュニティの全体のポイントは知識を共有することです。そのため、私の反対票に説明を追加し、さらにフィルターの提案が十分ではなかった理由を説明しました。上記のコードは安全ではないことを、あなたの答えを見つけた他の人と一緒に警告したいと思います。悪いコードを永続させるよりも、正しい方法を学ぶ方が誰にとっても良いです。そして、私はあなたの答えを削除することはできません。私も削除しません。あなたがそうすることを選択した場合、それはあなた次第です。
ブラッド

4

通常、データベースの接続性が失敗するとエラーが発生するため、必ずデータベースに接続するか、データベースファイルを含めてください。

include_once(db_connetc.php');

または

// Create a connection
$connection = mysql_connect("localhost", "root", "") or die(mysql_error());

//Select database
mysql_select_db("db_name", $connection) or die(mysql_error());

$employee_query = "SELECT * FROM employee WHERE `id` ='".$_POST['id']."'";

$employee_data = mysql_query($employee_query);

if (mysql_num_rows($employee_data) > 0) {

    while ($row = mysql_fetch_array($employee_data)){
        echo $row['emp_name'];
    } // end of while loop
} // end of if
  • ベストプラクティスは、sqlyogでクエリを実行し、ページコードにコピーすることです。
  • クエリを常に変数に格納してから、その変数をエコーし​​ます。次にに渡しmysql_query($query_variable);ます。

2
1)私がここで回答に賛成票を投じたかどうかはわかりません。2)最初のコメントで説明したように; あなたの答えは問題を参照せず(ブール値はmysql_fetch_arrayに渡されます)、構文エラーがあります
Phil

2
両方のコード例に誤った引用があります。2番目のコードブロックに適用された構文の強調表示は、何かが間違っていることを
Phil

4
このコードはSQLインジェクションの影響を受けるため、使用しないでください。@EngrZardariこの実稼働システムでこのコードを使用している場合、疑いなくハッキングされており、PDOまたは同様の準備済み/パラメーター化されたクエリを使用して状況を修正する必要があります。このような脆弱性のテストを自動化したボットがあります。
ブラッド

1
@EngrZardari 「エラーはありません。現在使用しているコードをここに貼り付けました。」 上記のコメント。私が修正したクエリに欠落した引用がありました。(PHP)解析エラーがスローされます。
Funk Forty Niner

2

このコードを試してみてください

ポスト変数を変数に割り当てます

   $username = $_POST['uname'];

   $password = $_POST['pass'];

  $result = mysql_query('SELECT * FROM userData WHERE UserName LIKE $username');

if(!empty($result)){

    while($row = mysql_fetch_array($result)){
        echo $row['FirstName'];
     }
}

3
このコードはSQLインジェクション攻撃の影響を受けるため、使用しないでください。
Brad

1

$ usernameはphp変数なので、mysqliに文字列として渡す必要があります。クエリでuが一重引用符で始まっているので、連結のために二重引用符、一重引用符、およびフルストップを使用します( "'。$ username。 '")二重引用符で始めた場合は、引用符を逆にします('"。$ username。 "')。

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE "'.$username.'"');

while($row = mysql_fetch_array($result))
     {
      echo $row['FirstName'];
     }

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".$username."' ");

while($row = mysql_fetch_array($result))
     {
      echo $row['FirstName'];
     }

Mysqlの使用は大幅に減りました。代わりにPDOを使用してください。シンプルですが非常に安全です。


しかし、Mysqlの使用は減りました。代わりにPDOを使用できます。ログイン例を紹介しましょう。
Dennis Kiptugen、2015年

2
パスワードは決してプレーンテキスト形式で保存しないでください。パスワードのハッシュとハッシュされたパスワードの検証を処理するためにPHPに組み込まれている機能を利用してください。
SpacePhoenix 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.