php - mysqli_result - warning mysql_fetch_array expects parameter 1 to be resource boolean




mysql_fetch_array()/ mysql_fetch_assoc()/ mysql_fetch_row()/ mysql_num_rows等...期望參數1是資源 (20)

確保你沒有關閉數據庫通過使用db_close()在運行你的查詢之前:

如果您在腳本中使用多個查詢,即使您包含其他包含查詢或數據庫連接的頁面,也可能在任何使用db_close()的地方關閉數據庫連接,因此請確保您不要在你的腳本中犯這個錯誤。

我試圖從MySQL表中選擇數據,但是我收到以下錯誤消息之一:

mysql_fetch_array()期望參數1是資源,布爾給定

要么

mysqli_fetch_array()期望參數1是mysqli_result,布爾給定

要么

在布爾/非對像上調用成員函數fetch_array()

這是我的代碼:

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

不要使用depricated 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();
?>

你可以試試這個代碼。 當我遇到類似於你的問題時,我發現它很早。

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;
}

你的代碼應該是這樣的

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

一旦完成,你會得到在屏幕上打印的查詢。 在你的服務器上試試這個查詢,看它是否能產生所需的結果。 大多數時候錯誤出現在查詢中。 其餘的代碼是正確的。


可能有兩個原因:

  1. 在調用mysql_query函數之前是否打開了與數據庫的連接? 我沒有看到你的代碼。 進行查詢前使用mysql_connect。 請參閱php.net/manual/en/function.mysql-connect.php

  2. 變量$ username在單引號字符串內部使用,所以它的值不會在查詢內求值。 查詢肯定會失敗。

第三,查詢結構很容易被SQL注入 。 您可以使用準備好的語句來避免這種安全威脅。


嘗試下面的代碼。 它可能正常工作。

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

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

在MySQL查詢之前包含連接字符串變量。 例如,這個代碼中的$connt

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

在執行讀取數組之前,您還可以檢查其$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'];
       }
}

如果您在檢查時沒有出現任何MySQL錯誤,請確保您已正確創建數據庫表。 這發生在我身上。 尋找任何不需要的逗號或引號。


把引號放在$username周圍。 與數字值相對的字符串值必須用引號引起來。

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

此外,如果您不使用通配符,則使用LIKE條件沒有意義:如果您需要完全匹配use =而不是LIKE


由於各種原因,查詢可能會失敗,在這種情況下,mysql_ *和mysqli擴展名將從其各自的查詢函數/方法返回false 。 您需要測試該錯誤情況並相應處理。

mysql_ *擴展名

注意 mysql_函數已被棄用 ,並已在PHP版本7中刪除。

在將它傳遞給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時不應該使用or die ,否則它(至少)會生成無效的HTML。 此外,數據庫錯誤消息不應該顯示給非管理員用戶,因為它洩露了太多信息


當您的查詢中有錯誤導致錯誤時,會顯示此錯誤消息。 它將在使用時顯現出來:

  • 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_*函數不應該用於新代碼。 他們不再被維護,社區已經開始了貶值過程 。 相反,您應該了解準備好的聲明並使用PDOMySQLi 。 如果你不能決定, 這篇文章將有助於選擇。 如果你在意學習,這裡有很好的PDO教程


試試這個,它一定是工作,否則你需要打印錯誤來指定你的問題

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

該查詢應該可以工作:

$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現在已被刪除。


這裡發生的錯誤是由於使用了單引號( ' )。 你可以把你的查詢像這樣:

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

它使用mysql_real_escape_string來防止SQL注入。 儘管我們應該使用MySQLi或PDO_MYSQL擴展來升級PHP版本(PHP 5.5.0及更高版本),但對於較早版本的mysql_real_escape_string將會有所斬獲。


通常,當您的數據庫檢測失敗時會發生錯誤,因此請確保連接數據庫或包含數據庫文件。

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);

首先,檢查你的數據庫連接。 它連接成功與否?

如果完成了,那麼之後我寫了這段代碼,它運行良好:

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;
}

$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>");      
}

您可以使用此ORDER BY查詢來代替使用WHERE查詢。 這比使用查詢要好得多。

我已經完成了這個查詢,並且沒有像參數或布爾值那樣的錯誤。


$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);


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




mysql