mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows 등… 매개 변수 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
다음을 사용하여 더 유용한 오류 메시지를 얻을 수 있습니다. : QUERY 또는 die (mysql_error ());
— nik

123
또한 필수 사항 : 귀하의 코드는 SQL 삽입에 취약합니다 . 사용자 입력을 확인하거나 이스케이프해야합니다. 를보십시오 mysql_real_escape_string. 사용자 데이터를 신뢰하지 마십시오.
— Felix Kling

7
사실, 영업 이익의 코드는 MySQL 서버에 구문 오류가 발생할 수 있지만, 적어도 그것은이다 없는 작은 따옴표는 변수 보간이 없기 때문에 SQL 인젝션에 취약.
— szgal

4
@FelixKling 나는 이것이 매우 오래되었고 당시 가장 정확한 것으로 알고 있지만 한 가지 방법으로 귀하의 의견은 위험 mysql_real_escape_string합니다. 여전히 많은 공격에 취약합니다. (아니, 당신은 그것이 완벽하다고 말한 적이 없지만 그것이 유일한 필수 솔루션임을 암시했습니다.) 지금 가장 좋은 해결책은 내가 아는 한 PDO입니다.
— 기금 모니카의 소송

2
가 MySQLi와 PDO를 포함하도록이 질문을 확장하는 것은 나쁜 생각이었습니다. 그들 각각은 약간 다른 구문과 오류 메시지를 가지고 있으며, 그들 자신의 질문을 완벽하게 가질 수있었습니다. 모든 것을 하나의 거대한 3 가지 질문으로 결합하면 Google 검색이 줄어들고 여기에 도착하는 사람들이 관련없는 콘텐츠를 통해 원하는 것을 얻을 수 있습니다. 또한 아래의 많은 답변이 무효화되었으며 일반적으로 적용되는 표준에 따라이 질문을 "너무 광범위합니다". 제 생각에는 엉망이지만 지금 고치기에는 너무 늦었습니다.
— Mark Amery

답변:


667

여러 가지 이유로 인해 쿼리가 실패 할 수 있으며,이 경우 mysql_ * 및 mysqli 확장은 false각각의 쿼리 함수 / 방법에서 반환 됩니다. 해당 오류 조건을 테스트하고 적절하게 처리해야합니다.

mysql_ * 확장자 :

참고 mysql_로 기능은 지원되지 않습니다 와 PHP 버전 7에서 제거되었습니다.

로 $result전달하기 전에 확인하십시오 mysql_fetch_array. 당신은 그것의 것을 찾을 수 있습니다 false쿼리가 실패했기 때문에. 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 스타일 :

$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 2016 년

28
OP에 대한 전체 오류 처리 메커니즘을 설계하려고했지만 이것이 내 답변 범위를 벗어난 것으로 판단했습니다.
— Edward Dale

@ scompt.com 예, 다른 답변도 다루고 있습니다. 난 그냥이가 있기 때문에 그 점하고 있었다 추측 허용 제대로 미래에 오류를 포착하는 방법에 대한 (우수) 외에 높은 가시성 질문에 대답, 조언, 그것 (IMHO)가 실제로 특정 질문에 대답해야한다 (즉 이 경우 왜 오류가 있는지 설명하십시오 .)
— Sepster

2
대신을 if($result === FALSE)사용할 수 있습니다 if(! $result). 내가 틀렸다면 나를 바로
— 잡으십시오

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에는 다른 답변이 없으므로 이에 대한 언급은 없습니다.
— Funk Forty Niner

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 2016 년

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

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 인젝션 공격에 널리 개방되어 있습니다.
— Brad

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 인젝션 공격에 널리 개방되어 있습니다.
— Brad

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)를 일치시킬 수 있습니다.

오류 처리, 사용 이스케이프 문자열 (가 임의의 코드가 아닙니다 사용자가 필드에 아무 것도 입력 할 수 있으며, 당신이 있는지 확인해야합니다), 사용 : 이것은 당신이 다른 게시물에 언급 된 물건을 구현해야합니다, 단순히 질문에 대한 답변입니다 PDO 대신로 mysql_connect를 현재 지원 중단되었습니다.


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의 경우 오류를 발생시키는 오류 처리가 포함되어 있지 않습니다.
— deceze

+1. @deceze 네, 활짝 열려 있습니다. 그러나 더 이상 그렇게 OP의 또는 허용 응답자의 코드 ;-) 그리고 오류의 부족이 아니라고 처리 오류의 원인이 영업 이익의 코드는 ... 그것의 오류 및 이상 시도에서이 대답 하나 넣어 (즉를 해결 없습니다 LIKE식에서 문자열 리터럴을 따옴표로 묶습니다 ).
— Sepster

1
+1 LIKE와 '$ username'사이에 공백을 추가하십시오. 나머지는 SQL 삽입을 제외하고는 괜찮습니다. 왜 = 대신 LIKE 연산자 이름으로 사용하지 정확히 일치해야합니다
— ASIM - 이샤

21

두 가지 이유가있을 수 있습니다.

  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 삽입의 영향을 받으므로 사용해서는 안됩니다.
— Brad

15

로 이동하십시오 config.php. 나는 같은 문제가 있었다. 사용자 이름과 비밀번호를 확인하고 sql select도 구성과 동일한 이름입니다.


15

더 이상 사용되지 않는 mysql_ * 함수를 사용하지 마십시오 (php 5.5에서 사용되지 않음은 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 2016 년

14

MySQL 쿼리 전에 연결 문자열 변수를 포함하십시오. 예를 들어, $connt이 코드에서 :

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

1
이것은 문제의 문제를 다루지 않습니다. 또한 잘못되어 다른 오류가 발생합니다.
— Paul Spiegel

12

당신이 얻을 때마다 ...

"경고 : mysqli_fetch_object ()는 매개 변수 1이 mysqli_result, boolean이 될 것으로 예상합니다"

... 쿼리에 문제가 있기 때문일 수 있습니다. prepare()또는 query()힘 리턴 FALSE(부울)하지만,이 일반 오류 메시지가 단서의 방법으로 많이 당신을 떠나지 않습니다. 검색어에 어떤 문제가 있는지 어떻게 알 수 있습니까? 당신은 질문 !

우선, 오류보고가 켜져 있고 표시되어 있는지 확인하십시오. 여는 <?php태그 바로 다음에 파일 상단에 다음 두 줄을 추가하십시오 .

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

오류보고가 php.ini에 설정되어 있으면 걱정할 필요가 없습니다. 오류를 정상적으로 처리하고 사용자에게 문제의 원인을 밝히지 마십시오. 대중에게 진정한 원인을 밝히는 것은 사이트와 서버에 해를 입히고 자하는 사람들에게 금으로 새겨진 초대 일 수 있습니다. 브라우저에 오류를 보내지 않으려면 항상 웹 서버 오류 로그를 모니터 할 수 있습니다. 로그 위치는 서버마다 다릅니다. 예를 들어 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;하나의 게시물에?
— Paul Spiegel

@PaulSpiegel을 도와 주셔서 감사합니다. 내가 답을 쓰거나 재검토 한 이후로 시간이 지났고 그곳에 반향을 남겼다는 것을 놓쳤다.
— Jay Blanchard

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 인젝션에 널리 공개되어 있으므로 사용해서는 안됩니다.
— Brad

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

간단한 필터 사용으로이 코드의 문제점을 수정하지는 않습니다. 가장 좋은 솔루션은 PDO 또는 이와 유사한 방식으로 준비 / 매개 변수화 된 쿼리를 사용하는 것입니다. 정답이 이미 여기에 게시되어 있으므로 문제를 해결할 점이 없습니다. 이상적으로이 답변은 삭제됩니다. 그러나 귀하는 귀하의 답변을 고치는 것을 환영하며 그것이 맞다면 기꺼이 답변을 드릴 것입니다.
— Brad

글쎄, 당신이 대답을 고려할 가치가 없다고 생각하면 계속해서 읽을 수 있습니다. 그러나 저는이 커뮤니티의 핵심은 지식을 공유하고 기여하는 것이라고 생각했습니다. 사람들을 보여주고 끄는 대신 공유 할 것이 있다면.
— user28864

2
이 커뮤니티의 요점은 지식을 공유하는 것입니다. 그래서 다운 보트에 설명을 추가하고 필터 제안이 충분하지 않은 이유를 더 설명했습니다. 위의 코드가 안전하지 않다는 것을 귀하의 답변을 찾은 사람과 함께 알려주십시오. 모든 사람이 잘못된 코드를 영속하는 대신 올바른 방법을 배우는 것이 좋습니다. 그리고, 나는 당신의 대답을 삭제할 수 없으며, 그렇게하지 않을 것입니다.
— Brad

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 전달 부울 ) 당신은 구문 오류가
— 필

2
두 코드 예제 모두에서 따옴표가 잘못되었습니다. 두 번째 코드 블록에 적용된 구문 강조 표시는 무언가 잘못되었다는 것을
— Phil

4
이 코드는 SQL 삽입의 영향을 받으므로 사용해서는 안됩니다. 프로덕션 시스템에서이 코드를 사용하는 경우 @EngrZardari 의심 할 여지없이 해킹 당했으며 PDO 또는 이와 유사한 준비된 / 매개 변수화 된 쿼리를 사용하여 구매 상황을 해결해야합니다. 이러한 취약점에 대한 자동화 된 테스트를 수행 한 봇이 있습니다.
— Brad

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

2
패스워드는 절대 평범한 텍스트 형태로 저장되어서는 안되며, PHP는 패스워드 해싱과 해시 패스워드 확인을 처리하기 위해 내장 된 기능을 사용하지 마십시오!
— SpacePhoenix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.