mysqli_fetch_array()/ mysqli_fetch_assoc()/ mysqli_fetch_row()期望参数1是资源或mysqli_result,布尔给定
我试图从MySQL表中select数据,但是我得到以下错误消息之一:
mysql_fetch_array()期望参数1是资源,布尔给定
要么
mysqli_fetch_array()期望参数1是mysqli_result,布尔给定
这是我的代码:
$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, 'SLECT ...'); // mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given while( $row=mysqli_fetch_array($result) ) { ...
和
$result = $mysqli->query($mysqli, 'SELCT ...'); // Call to a member function fetch_assoc() on a non-object while( $row=$result->fetch_assoc($result) ) { ...
和
$result = $pdo->query('SLECT ...', PDO::FETCH_ASSOC); // Invalid argument supplied for foreach() foreach( $result as $row ) { ...
和
$stmt = $mysqli->prepare('SLECT ...'); // Call to a member function bind_param() on a non-object $stmt->bind_param(...)
和
$stmt = $pdo->prepare('SLECT ...'); // Call to a member function bindParam() on a non-object $stmt->bindParam(...)
由于各种原因,查询可能会失败,在这种情况下,mysql_ *和mysqli扩展将从其各自的查询函数/方法返回false
。 您需要testing该错误情况并相应地进行处理。
mysql_ *扩展名 :
注意 mysql_函数已被弃用 ,并已在PHP版本7中被删除。
在将它传递给mysql_fetch_array
之前检查$result
。 你会发现它是false
因为查询失败。 请参阅mysql_query
文档以获取可能的返回值以及如何处理它们的build议。
$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 ) { ...
这些例子只是说明应该做什么(error handling),而不是如何做。 生产代码在输出HTML时不应该使用or die
,否则(至less)会生成无效的HTML。 此外,数据库错误消息不应该显示给非pipe理员用户,因为它泄露了太多的信息 。
当您的查询中有错误导致错误时,将显示此错误消息。 它将在使用时performance出来:
-
mysql_fetch_array
/mysqli_fetch_array()
-
mysql_fetch_assoc()
/mysqli_fetch_assoc()
-
mysql_num_rows()
/mysqli_num_rows()
注意 :如果没有行受到查询的影响,则不会出现此错误。 只有具有无效语法的查询才会生成此错误。
故障排除步骤
-
确保您的开发服务器configuration为显示所有错误。 你可以把它放在你的文件的顶部或者你的configuration文件中:
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这样的工具运行您的查询。 如果你的查询语法错误,这会告诉你它是什么。
-
确保你的报价是正确的。 关于查询或值的缺less引号会导致查询失败。
-
确保你逃脱了你的价值。 查询中的引号可能会导致查询失败(也会使您打开SQL注入)。 使用
mysql_real_escape_string()
来转义您的input。 -
确保你没有混合
mysqli_*
和mysql_*
函数。 它们不是一回事,也不能一起使用。 (如果你要select一个或另一个与mysqli_*
棍子,请参阅下面的原因。)
其他技巧
mysql_*
函数不应该用于新的代码。 他们不再被维护,社区已经开始了贬值过程 。 相反,您应该了解准备好的语句,并使用PDO或MySQLi 。 如果你不能决定, 这篇文章将有助于select。 如果你在意学习,这里是很好的PDO教程 。
这里发生的错误是由于使用了单引号( '
)。 你可以把你的查询这样的:
mysql_query(" SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string ($username)."' ");
它使用mysql_real_escape_string
来防止SQL注入。 尽pipe我们应该使用MySQLi或者PDO_MYSQL扩展名来升级PHP版本(PHP 5.5.0及更高版本),但是对于旧版本的mysql_real_escape_string
将会有所斩获。
正如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()
的文档 。
实际的错误是单引号,所以variables$username
不被parsing。 但是你应该使用mysql_real_escape_string($username)
来避免SQL注入。
放在$username
引号。 与数字值相对的string值必须用引号引起来。
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
而且,如果不使用通配符,则使用LIKE
条件没有意义:如果您需要使用完全匹配use =
而不是LIKE
。
请检查一次select的数据库不是因为某些时候没有select数据库
检查
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());
你的代码应该是这样的
$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']; }
一旦完成,你会得到在屏幕上打印的查询。 试试这个查询在你的服务器上,看看它是否产生所需的结果。 大多数时候错误在查询中。 其余的代码是正确的。
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
您使用单引号定义string,PHP不parsing单引号分隔的string。 为了获得variables插值,你将需要使用双引号或string连接(或其组合)。 有关更多信息,请参见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获取更多信息。;
这个查询应该工作:
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'"); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; }
问题是单引号,因此你的查询失败,返回FALSE,你的WHILE循环无法执行。 使用%可以让你匹配任何包含你的string的结果(比如SomeText- $ username-SomeText)。
这只是你的问题的答案,你应该实现在其他post中提到的东西:error handling,使用转义string(用户可以input任何东西到字段中,你必须确保它不是任意代码),使用PDO,而不是mysql_connect这是现在被摧毁。
$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);
取消@mysql_query(your query);
如果你在这里尝试了一切,而且不起作用,你可能想检查你的MySQL数据库sorting规则。 矿被设置为瑞典语整理。 然后我把它改成utf8_general_ci
,所有的东西都被点击了。
我希望这可以帮助别人。
$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查询。 对于使用查询来说,这比这要好得多。
我已经完成了这个查询,并没有得到像参数或布尔错误。
试试这个,一定是工作,否则你需要打印错误来指定你的问题
$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']; }
尝试下面的代码。 它可能正常工作。
$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_query函数之前是否打开了与数据库的连接? 我没有看到你的代码。 进行查询前使用mysql_connect。 请参阅
php.net/manual/en/function.mysql-connect.php
-
variables$ username在一个单引号string中使用,所以它的值不会在查询中被计算。 查询肯定会失败。
第三,查询结构很容易被SQL注入 。 您可以使用准备好的语句来避免这种安全威胁。
<?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."'");
去你的config.php
。 我有同样的问题。 validation用户名和密码,并且sql select与config的名字相同。
在MySQL查询之前包含连接stringvariables。 例如, $connt
在这个代码中:
$results = mysql_query($connt, "SELECT * FROM users");
不要使用被删除的mysql_ *函数(在php 5.5中删除将在PHP 7中删除)。 你可以用mysqli或者pdo做这个
这里是完整的select查询
<?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; }
<?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']; } ?>
尝试这个
$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']; } }
确保你没有closures数据库通过使用db_close()在运行你的查询之前:
如果您在脚本中使用多个查询,即使您包含其他包含查询或数据库连接的页面,也可能在任何使用db_close()的地方closures数据库连接,请确保您不要在你的脚本中犯这个错误。
任何时候你得到…
“警告:mysqli_fetch_object()期望参数1是mysqli_result,布尔给定”
…很可能是因为您的查询存在问题。 prepare()
或query()
可能会返回FALSE
(一个布尔值),但是这个通用的失败消息并没有给你太多的线索。 你怎么知道你的查询有什么问题? 你问 !
首先,确保错误报告已打开并可见:在打开<?php
标记之后立即将这两行添加到文件顶部:
error_reporting(E_ALL); ini_set('display_errors', 1);
如果您的错误报告已经在php.ini中设置,您将不必担心这一点。 只要确保处理错误,不要向用户泄漏任何问题的真正原因。 向公众揭示真正的事业可以是那些想要伤害你的网站和服务器的人的黄金邀请。 如果您不想向浏览器发送错误,则可以随时监控您的Web服务器错误日志。 日志位置因服务器而异,例如在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; echo $error; // 1054 Unknown column 'foo' in 'field list' }
如果有什么不对,你可以吐出一个错误信息,直接把你的问题。 在这种情况下,表中没有foo
列,解决这个问题是微不足道的。
如果你select,你可以在一个函数或类中包含这个检查,并通过如前所述优雅地处理错误来扩展它。
首先检查你的连接。
那么如果你想从数据库中获取确切的值,那么你应该写:
$username = $_POST['username']; $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName =`$usernam`");
或者你想获取LIKE
types的值,那么你应该写:
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
如果您在检查时没有出现任何MySQL错误,请确保您正确创build了您的数据库表。 这发生在我身上。 寻找任何不需要的逗号或引号。
在执行读取数组之前,您也可以检查其$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']; } }
通常,当数据库结构失败时会发生错误,因此请确保连接数据库或包含数据库文件。
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中运行查询,然后将其复制到您的页面代码中。
- 始终将查询存储在一个variables中,然后回显该variables。 然后传递给
mysql_query($query_variable);
。
试试这个代码,它工作正常
将postvariables赋值给variables
$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']; } }
你可以试试这个代码。 当我遇到类似于您的问题时,我发现它较早。
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; }