복붙노트

mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows 등 ... 매개 변수 1이 리소스가 될 것으로 예상 함

PHP

mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows 등 ... 매개 변수 1이 리소스가 될 것으로 예상 함

MySQL 테이블에서 데이터를 선택하려고하는데 다음 오류 메시지 중 하나가 표시됩니다.

또는

또는

이것은 내 코드입니다.

$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'];
}

같은 코드에도 적용됩니다.

$result = mysqli_query($mysqli, 'SELECT ...');
// mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given
while( $row=mysqli_fetch_array($result) ) {
    ...

$result = $mysqli->query($mysqli, 'SELECT ...');
// Call to a member function fetch_assoc() on a non-object
while( $row=$result->fetch_assoc($result) ) {
    ...

$result = $pdo->query('SELECT ...', PDO::FETCH_ASSOC);
// Invalid argument supplied for foreach()
foreach( $result as $row ) {
    ...

$stmt = $mysqli->prepare('SELECT ...');
// Call to a member function bind_param() on a non-object
$stmt->bind_param(...);

$stmt = $pdo->prepare('SELECT ...');
// Call to a member function bindParam() on a non-object
$stmt->bindParam(...);

해결법

  1. ==============================

    1.

    mysql_ *과 mysqli 확장 모두가 각각의 쿼리 함수 / 메소드에서 false를 반환하는 여러 가지 이유로 쿼리가 실패 할 수 있습니다. 오류 상태를 테스트하고 그에 따라 처리해야합니다.

    mysql_ * 확장자 :

    mysql_fetch_array에 전달하기 전에 $ result를 검사하십시오. 쿼리가 실패했기 때문에 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 ) {
          ...
    

    이 예제는 수행 방법 (오류 처리)이 아닌 수행 방법을 보여줍니다. 제작 코드는 HTML을 출력 할 때 사용하거나 죽지 않아야합니다. 그렇지 않으면 잘못된 HTML이 생성됩니다 (최소한). 또한 관리자가 아닌 사용자에게 너무 많은 정보를 공개하므로 데이터베이스 오류 메시지를 표시해서는 안됩니다.

  2. ==============================

    2.

    쿼리에 오류가 발생하여 오류가 발생하면이 오류 메시지가 표시됩니다. 다음을 사용할 때 자체적으로 나타납니다.

    주 : 조회의 영향을 ^는 행이 없으면이 오류가 표시되지 않습니다. 구문이 잘못된 쿼리 만이 오류를 생성합니다.

    문제 해결 단계

    기타 팁

    새로운 코드에는 mysql_ * 함수를 사용하면 안됩니다. 그들은 더 이상 유지 관리되지 않으며 커뮤니티는 비추천 프로세스를 시작했습니다. 대신 준비된 문장을 배우고 PDO 또는 MySQLi를 사용해야합니다. 결정할 수 없다면이 기사가 선택하는 데 도움이 될 것입니다. 배울 점이 있다면 여기 PDO 자습서가 좋습니다.

  3. ==============================

    3.

    여기에서 발생한 오류는 작은 따옴표 ( ')를 사용했기 때문에 발생했습니다. 다음과 같이 쿼리를 작성할 수 있습니다.

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

    SQL 인젝션 방지를 위해 mysql_real_escape_string을 사용하고 있습니다. 업그레이드 된 버전의 PHP (PHP 5.5.0 이상)에는 MySQLi 또는 PDO_MYSQL 확장을 사용해야하지만 이전 버전의 경우에는 mysql_real_escape_string이 트릭을 수행합니다.

  4. ==============================

    4.

    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이 구문 분석되지 않았습니다. 하지만 SQL 인젝션을 피하려면 mysql_real_escape_string ($ username)을 사용해야한다.

  5. ==============================

    5.

    $ username을 인용 부호로 묶으십시오. 숫자 값이 아닌 문자열 값은 따옴표로 묶어야합니다.

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

    와일드 카드를 사용하지 않는 경우에도 LIKE 조건을 사용하지 않아도됩니다. 정확히 일치하는 것이 필요한 경우 LIKE 대신 use =를 사용하십시오.

  6. ==============================

    6.

    일부 데이터베이스가 선택되어 있지 않기 때문에 선택한 데이터베이스가 아닌지 확인하십시오.

    검사

    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());
    
  7. ==============================

    7.

    코드는 다음과 같아야합니다.

    $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'];
    }
    

    이 작업을 완료하면 화면에 쿼리가 인쇄됩니다. 서버에서이 쿼리를 실행하여 원하는 결과가 나오는지 확인하십시오. 대부분의 경우 오류가 쿼리에 있습니다. 나머지 코드는 정확합니다.

  8. ==============================

    8.

    $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를 참조하십시오.

  9. ==============================

    9.

    이 쿼리는 작동해야합니다.

    $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 그것은 이제 양심의 가책을 받았다.

  10. ==============================

    10.

    $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 (쿼리)로 표시하지 않습니다.

  11. ==============================

    11.

    여기서 모든 것을 시도해 보았지만 작동하지 않는다면 MySQL 데이터베이스 정렬을 확인하는 것이 좋습니다. 광산은 스웨덴의 데이터 정렬로 설정되었습니다. 그런 다음 utf8_general_ci로 변경하고 모든 것을 기어에 넣었습니다.

    나는 이것이 누군가를 돕기를 바랍니다.

  12. ==============================

    12.

    $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 쿼리를 사용할 수 있습니다. 그것은 쿼리를 사용하는 것보다 훨씬 낫습니다.

    이 쿼리를 수행하고 매개 변수 또는 부울 같은 오류가 없습니다.

  13. ==============================

    13.

    이것을 시도해보십시오. 작동해야합니다. 그렇지 않으면 문제를 지정하기 위해 오류를 인쇄해야합니다.

    $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'];
    }
    
  14. ==============================

    14.

    다음 코드를 시도해보십시오. 그것은 잘 작동 할지도 모른다.

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

    15.

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

    셋째, 쿼리의 구조가 SQL 삽입에 취약합니다. 이 보안 위협을 피하기 위해 준비된 문을 사용할 수 있습니다.

  16. ==============================

    16.

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

  17. ==============================

    17.

    <?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."'");
    
  18. ==============================

    18.

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

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

    19.

    사용되지 않는 mysql * 함수를 사용하지 마십시오 (php 5.5에서는 더 이상 사용되지 않습니다). 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();
    ?>
    
  20. ==============================

    20.

    이 시도

    $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'];
    }
    }
    
  21. ==============================

    21.

    먼저 데이터베이스에 대한 연결을 확인하십시오. 성공적으로 연결 되었습니까?

    작업이 완료되면이 코드를 작성하고 올바르게 작동합니다.

    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;
    }
    
  22. ==============================

    22.

    <?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'];
     }
     ?>
    
  23. ==============================

    23.

    언제든지 당신은 ...

    ... 쿼리에 문제가있어 가능성이 있습니다. prepare () 또는 query ()는 FALSE (Boolean)를 반환 할 수 있지만 이러한 일반적인 실패 메시지는 단서를 많이 남기지 않습니다. 당신의 질문에 무엇이 잘못되었는지 어떻게 알 수 있습니까? 물어!

    먼저 오류보고가 켜져 있고 표시되는지 확인하십시오. 여는

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

    오류보고가 php.ini에서 설정 되었다면 걱정할 필요가 없습니다. 오류를 정상적으로 처리하고 모든 문제의 진정한 원인을 사용자에게 공개하지 마십시오. 진정한 대중을 공개하는 것은 사이트와 서버에 해를 끼치고 자하는 사람들을 위해 황금으로 새겨진 초대장이 될 수 있습니다. 브라우저에 오류를 보내지 않으려면 웹 서버 오류 로그를 항상 모니터 할 수 있습니다. 로그 위치는 서버마다 다를 수 있습니다. 예를 들어 우분투에서는 오류 로그가 일반적으로 /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;
        echo $error; // 1054 Unknown column 'foo' in 'field list'
    }
    

    문제가 발생하면 직접 오류 메시지를 표시하는 오류 메시지를 낼 수 있습니다. 이 경우 테이블에 foo 열이 없으므로 문제를 해결하는 것이 간단합니다.

    선택하면 함수 또는 클래스에이 검사를 포함시키고 오류를 정상적으로 처리하여 확장 할 수 있습니다.

  24. ==============================

    24.

    스크립트에서 쿼리 나 데이터베이스 연결이 포함 된 다른 페이지를 포함하고 있어도 여러 개의 쿼리를 사용하는 경우 데이터베이스 연결을 닫을 db_close ()를 사용하는 곳이면 어디서든 사용할 수 있습니다. 스크립트에서이 실수를하지 마십시오.

  25. ==============================

    25.

    먼저 연결을 확인하십시오.

    그런 다음 데이터베이스에서 정확한 값을 가져 오려면 다음과 같이 작성해야합니다.

    $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%'");
    
  26. ==============================

    26.

    검사하는 동안 MySQL 오류가 나타나지 않으면 데이터베이스 테이블이 제대로 작성되었는지 확인하십시오. 이것은 나에게 일어났다. 원치 않는 쉼표 나 따옴표를 찾으십시오.

  27. ==============================

    27.

    또한 fetch 배열을 실행하기 전에 $ 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'];
           }
    }
    
  28. ==============================

    28.

    이 코드를 사용해보십시오. 나는 당신과 비슷한 문제가 생겼을 때 일찍 그것을 발견했습니다.

    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;
    }
    
  29. ==============================

    29.

    일반적으로 데이터베이스 연결에 실패하면 오류가 발생하므로 데이터베이스를 연결하거나 데이터베이스 파일을 포함하십시오.

    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
    
  30. ==============================

    30.

    잘 작동하는이 코드를 사용해보십시오.

    게시물 변수를 변수에 할당

       $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'];
         }
    }
    
  31. from https://stackoverflow.com/questions/11674312/warning-mysql-fetch-expects-parameter-1-to-be-resource-boolean-given-error by cc-by-sa and MIT lisence