我正在尝试从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(...);
#1楼
请检查一次选定的数据库是否不是,因为有时未选择数据库
校验
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());
#2楼
当查询中出现错误导致失败时,将显示此错误消息。 使用时将显示出来:
-
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教程 。
#3楼
如果您在这里尝试了所有操作,但没有成功,则可能要检查MySQL数据库排序规则。 我的被定为瑞典人整理。 然后,我将其更改为utf8_general_ci
,一切都随即生效。
我希望这可以帮助别人。
#4楼
尝试此操作,它必须可以工作,否则您需要打印错误以指定问题
$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'];
}
#5楼
此查询应工作:
$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现在已被描述。
#6楼
首先,检查您与数据库的连接。 是否成功连接?
如果完成了,那么之后我就编写了这段代码,并且效果很好:
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;
}
#7楼
可能有两个原因:
在调用mysql_query函数之前,您是否已打开与数据库的连接? 我在您的代码中看不到。 进行查询之前,请使用mysql_connect。 参见
php.net/manual/en/function.mysql-connect.php
变量$ username在单引号字符串内使用,因此不会在查询内评估其值。 查询肯定会失败。
第三,查询的结构易于进行SQL注入 。 您可以使用准备好的语句来避免这种安全威胁。
#8楼
$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);
#9楼
请尝试以下代码。 它可能工作正常。
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'");
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
#10楼
首先检查您的连接。
然后,如果要从数据库中获取确切的值,则应编写:
$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%'");
#11楼
$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查询。 使用查询要比这好得多。
我已经完成了此查询,并且没有收到像参数或布尔值这样的错误。
#12楼
<?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."'");
#13楼
转到您的config.php
。 我有同样的问题。 验证用户名和密码,并且sql select与配置名称相同。
#14楼
在MySQL查询之前添加连接字符串变量。 例如,以下代码中的$connt
:
$results = mysql_query($connt, "SELECT * FROM users");
#15楼
您还可以在执行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'];
}
}
#16楼
通常,当数据库连接失败时会发生错误,因此请确保连接数据库或包括数据库文件。
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);
。
#17楼
试试这个代码可以正常工作
将post变量分配给该变量
$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'];
}
}
#18楼
在运行查询之前,请确保不使用db_close()关闭数据库:
如果您在脚本中使用多个查询,甚至包括其他包含查询或数据库连接的页面,那么在任何地方都可能使用db_close()来关闭数据库连接,因此请确保不要在脚本中执行此错误。
#19楼
如果检查时没有出现MySQL错误,请确保正确创建了数据库表。 这发生在我身上。 查找任何不需要的逗号或引号。
#20楼
您可以尝试此代码。 我在遇到类似于您的问题时较早找到了它。
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;
}
#21楼
<?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'];
}
?>
#22楼
不要使用已描述的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();
?>
#23楼
查询可能由于各种原因而失败,在这种情况下,mysql_ *和mysqli扩展名都将从各自的查询函数/方法中返回false
。 您需要测试该错误情况并进行相应处理。
注意 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 ) {
...
这些示例仅说明了应该执行的操作(错误处理),而没有说明如何执行。 生产代码在输出HTML时不应使用or die
,否则它将(至少)生成无效的HTML。 另外,数据库错误消息不应显示给非管理员用户,因为它会显示过多信息 。
#24楼
在$username
周围加上引号。 与数字值相反,字符串值必须用引号引起来。
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
另外,如果您不使用通配符,则没有必要使用LIKE
条件:如果需要完全匹配,请使用=
代替LIKE
。
#25楼
出现错误是由于使用单引号( '
)。 您可以这样查询:
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
可以解决问题。
#26楼
如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注入。
#27楼
您的代码应该是这样的
$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'];
}
完成此操作后,您将在屏幕上打印查询。 在您的服务器上尝试此查询,看看它是否产生期望的结果。 在大多数情况下,错误是在查询中。 其余代码是正确的。
#28楼
尝试这个
$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'];
}
}
#29楼
任何时候得到...
“警告: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
列,因此解决该问题很简单。
如果选择,可以将此检查包括在函数或类中,并通过如前所述优雅地处理错误来扩展它。
#30楼
$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 。