Analysis and Solution for 'Object of class mysqli_result could not be converted to string' Error in PHP

Nov 22, 2025 · Programming · 10 views · 7.8

Keywords: PHP | MySQLi | Database Query | Error Handling | Result Set Processing

Abstract: This article provides an in-depth analysis of the common PHP error 'Object of class mysqli_result could not be converted to string', explaining the object type characteristics returned by mysqli_query function, demonstrating correct data extraction methods through complete code examples including using fetch_assoc() to iterate through result sets, and discussing related database operation best practices.

Error Phenomenon and Cause Analysis

During PHP development, many developers encounter the error message: Object of class mysqli_result could not be converted to string. This error typically occurs when attempting to directly use the result object returned by the mysqli_query function as a string.

Let's first examine a typical error example:

$result = mysqli_query($con, "SELECT classtype FROM learn_users WHERE username='abcde'");
echo "my result <a href='data/$result.php'>My account</a>";

In this code, the developer expects the $result variable to contain the string value of the query result, but in reality, the mysqli_query() function returns a mysqli_result object. This object is a resource identifier pointing to the result set returned by the MySQL server, not direct string data.

Nature of mysqli_result Object

mysqli_result is an object in the MySQLi extension used to represent query results. It contains all the row data returned by the query, along with relevant metadata information. When we execute a SELECT query, the MySQL server returns a result set, and PHP manages this result set through the mysqli_result object.

This object has the following important characteristics:

Correct Data Extraction Methods

To properly extract data from the mysqli_result object, we need to use specialized methods to iterate through the result set. The most commonly used method is fetch_assoc(), which returns an associative array where keys are field names and values are corresponding data.

Here is the correct code implementation:

$result = mysqli_query($con, "SELECT classtype FROM learn_users WHERE username='abcde'");

if ($result && $result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo $row['classtype'] . "<br>";
    }
} else {
    echo "No results found";
}

// Free the result set
$result->free();

In this improved version, we first check if the query executed successfully and returned results. Then we use a while loop with the fetch_assoc() method to extract data row by row. Each call to fetch_assoc() returns the next row of data until all rows have been processed.

Other Data Extraction Methods

In addition to fetch_assoc(), MySQLi provides several other data extraction methods:

Using fetch_row() Method

while ($row = $result->fetch_row()) {
    echo $row[0] . "<br>";  // Access fields using numeric indices
}

Using fetch_array() Method

while ($row = $result->fetch_array()) {
    echo $row['classtype'] . "<br>";  // Associative array approach
    echo $row[0] . "<br>";           // Numeric index approach
}

Using fetch_object() Method

while ($obj = $result->fetch_object()) {
    echo $obj->classtype . "<br>";  // Access via object properties
}

Practical Application Scenario Analysis

Let's return to the specific application scenario in the original problem. The developer wants to dynamically generate links based on query results:

$result = mysqli_query($con, "SELECT classtype FROM learn_users WHERE username='abcde'");

if ($result && $result->num_rows > 0) {
    $row = $result->fetch_assoc();
    $classtype = $row['classtype'];
    echo "my result <a href='data/" . htmlspecialchars($classtype) . ".php'>My account</a>";
} else {
    echo "User not found";
}

In this correct implementation, we first extract the value of the classtype field, then use this value to construct the link. Additionally, we use the htmlspecialchars() function to prevent XSS attacks, which is an important security practice in web development.

Related Error Pattern Analysis

Similar errors occur not only in string concatenation scenarios but also in other contexts that require scalar values. The mathematical operation scenario mentioned in the reference article is a good example:

// Error example
$result = mysqli_query($con, "SELECT base_pay FROM guest where name='Mahtab'");
mysqli_query($con, "UPDATE guest SET net_pay='$result*15' WHERE name='Mahtab'");

In this example, the developer attempts to perform mathematical operations on a mysqli_result object within an UPDATE statement, which similarly triggers a type conversion error. The correct approach should be:

$result = mysqli_query($con, "SELECT base_pay FROM guest where name='Mahtab'");

if ($result && $result->num_rows > 0) {
    $row = $result->fetch_assoc();
    $base_pay = $row['base_pay'];
    $net_pay = $base_pay * 15;
    
    mysqli_query($con, "UPDATE guest SET net_pay='$net_pay' WHERE name='Mahtab'");
}

Error Prevention and Best Practices

To avoid such errors, it's recommended to follow these best practices:

1. Type Checking

Always check the type of the return value before using query results:

if ($result instanceof mysqli_result) {
    // Properly handle the result set
} else {
    // Handle query failure cases
}

2. Error Handling

Comprehensive error handling mechanisms can detect problems early:

$result = mysqli_query($con, $sql);

if (!$result) {
    die('Query failed: ' . mysqli_error($con));
}

3. Result Validation

Verify if data is returned before processing results:

if ($result->num_rows === 0) {
    echo 'No records found';
    return;
}

4. Resource Release

Promptly release result set resources:

$result->free();  // or mysqli_free_result($result);

Performance Considerations and Optimization

When dealing with large result sets, pay attention to memory usage and performance:

Using Unbuffered Queries

$result = mysqli_query($con, $sql, MYSQLI_USE_RESULT);

Batch Processing of Large Data

$offset = 0;
$limit = 1000;

do {
    $sql = "SELECT * FROM large_table LIMIT $offset, $limit";
    $result = mysqli_query($con, $sql);
    
    // Process current batch
    while ($row = $result->fetch_assoc()) {
        // Process data
    }
    
    $result->free();
    $offset += $limit;
} while (/* Check if more data exists */);

Conclusion

The Object of class mysqli_result could not be converted to string error stems from misunderstanding the nature of MySQLi query result objects. Properly understanding the characteristics of mysqli_result objects, mastering appropriate data extraction methods, and following good programming practices can effectively prevent such errors. Through the detailed analysis and code examples in this article, developers should be able to correctly handle MySQLi query results and write more robust and secure PHP applications.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.