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.