我正在尝试从MySQL表中选择数据,但是我收到以下错误消息之一:
mysql_fetch_array()期望参数1为资源,布尔值为
或
mysqli_fetch_array()期望参数1为mysqli_result,boolean given
或
在boolean / non-object
上调用成员函数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(...);
答案 0 :(得分:648)
查询可能由于各种原因而失败,在这种情况下,mysql_ *和mysqli扩展将从各自的查询函数/方法返回false
。您需要测试该错误情况并相应地处理它。
<强> mysql_* extension 强>:
注意 mysql_ functions are deprecated已在php 7中删除。
在将$result
传递给mysql_fetch_array
之前检查false
。您会发现它是$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'];
}
,因为查询失败了。有关可能的返回值以及如何处理它们的建议,请参阅mysql_query
文档。
$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 ) {
...
<强> mysqli extension 强>
程序风格:
$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 ) {
...
oo-style :
$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 ) {
...
使用预先准备的声明:
{{1}}
这些示例仅说明应该做什么(错误处理),而不是如何做。生产代码在输出HTML时不应使用or die
,否则它将(至少)生成无效的HTML。此外,不应将数据库错误消息显示给非管理员用户,因为它discloses too much information。
答案 1 :(得分:163)
如果查询中出现导致其失败的错误,则会显示此错误消息。它将在使用时表现出来:
mysql_fetch_array
/ mysqli_fetch_array()
mysql_fetch_assoc()
/ mysqli_fetch_assoc()
mysql_num_rows()
/ mysqli_num_rows()
注意:如果查询不影响任何行,则会出现 not 错误。只有语法无效的查询才会生成此错误。
疑难解答步骤
确保将开发服务器配置为显示所有错误。您可以将其放在文件顶部或配置文件中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_*
函数不应用于新代码。它们已不再维护,社区已开始deprecation process。相反,您应该了解prepared statements并使用PDO或MySQLi。如果您无法决定,this article将有助于选择。如果您需要学习,请good PDO tutorial。
答案 2 :(得分:110)
此处发生错误是由于使用单引号('
)。您可以像这样查询:
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
,我们应该这样做。
答案 3 :(得分:60)
如scompt.com explained,查询可能会失败。使用此代码获取查询的错误或正确的结果:
$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;
}
有关详细信息,请参阅documentation for mysql_query()
。
实际错误是单引号,因此未解析变量$username
。但是你应该使用mysql_real_escape_string($username)
来避免SQL注入。
答案 4 :(得分:54)
在$username
附近加上引号。字符串值与数字值相对,必须用引号括起来。
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
此外,如果您不使用通配符,则使用LIKE
条件是没有意义的:如果您需要完全匹配,请使用=
代替LIKE
。
答案 5 :(得分:44)
请选择所选数据库后检查,因为有时未选择数据库
检查
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());
答案 6 :(得分:41)
您的代码应该是这样的
$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'];
}
完成后,您将在屏幕上打印查询。在您的服务器上尝试此查询,看看它是否产生了所需的结果。大多数情况下,错误都在查询中。其余的代码是正确的。
答案 7 :(得分:36)
$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'];
}
}
答案 8 :(得分:35)
此查询应该有效:
$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,现在已被删除。
答案 9 :(得分:30)
$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);
答案 10 :(得分:28)
如果您在此处尝试了所有操作,但它不起作用,您可能需要检查MySQL数据库排序规则。我的目标是瑞典校对。然后我将其更改为utf8_general_ci
,所有内容都点击进入装备。
我希望这有助于某人。
答案 11 :(得分:26)
$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查询。使用查询比使用它要好得多。
我已经完成了这个查询,并且没有得到像参数或布尔值这样的错误。
答案 12 :(得分:26)
试试这个,它必须有效,否则你需要打印错误来指定你的问题
$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'];
}
答案 13 :(得分:22)
尝试以下代码。它可能工作正常。
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'");
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
答案 14 :(得分:21)
可能有两个原因:
在调用mysql_query函数之前,您是否打开了与数据库的连接?我在你的代码中没有看到。在进行查询之前使用mysql_connect。请参阅php.net/manual/en/function.mysql-connect.php
变量 $ username 用于单引号字符串中,因此不会在查询中评估其值。查询肯定会失败。
第三,查询结构容易SQL injection。您可以使用预准备语句来避免此安全威胁。
答案 15 :(得分:16)
<?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."'");
答案 16 :(得分:16)
转到config.php
。我有同样的问题。验证用户名和密码,并且sql select与配置名称相同。
答案 17 :(得分:15)
在MySQL查询之前包含连接字符串变量。例如,此代码中的$connt
:
$results = mysql_query($connt, "SELECT * FROM users");
答案 18 :(得分:15)
不要使用已弃用的mysql *函数(在PHP 7中不推荐使用,将在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();
?>
答案 19 :(得分:13)
试试这个
$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'];
}
}
答案 20 :(得分:11)
首先,检查您与数据库的连接。是否成功连接?
如果已经完成,那么之后我编写了这段代码,并且效果很好:
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 :(得分:11)
任何时候你得到......
&#34;警告:mysqli_fetch_object()期望参数1为mysqli_result,布尔值为&#34;
...可能是因为您的查询存在问题。 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
列,解决问题是微不足道的。
如果您选择,您可以在函数或类中包含此检查,并通过如前所述优雅地处理错误来扩展它。
答案 22 :(得分:11)
<?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 :(得分:10)
确保您没有关闭数据库使用db_close()To To 运行您的查询:
如果您在脚本中使用多个查询,即使您包含其他包含查询或数据库连接的页面,那么您可能在任何地方使用db_close()来关闭数据库连接,因此请确保你在脚本中没有犯这个错误。
答案 24 :(得分:9)
如果您在检查时没有出现任何MySQL错误,请确保您正确创建了数据库表。这发生在我身上。查找任何不需要的逗号或引号。
答案 25 :(得分:9)
首先检查您的连接。
然后,如果你想从数据库中获取确切的值,那么你应该写:
$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 :(得分:8)
在执行获取数组
之前,您还可以检查$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'];
}
}
答案 27 :(得分:7)
您可以尝试使用此代码。当我遇到类似你的问题时,我早些时候发现了它。
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;
}
答案 28 :(得分:6)
通常,当数据库连接失败时会发生错误,因此请确保连接数据库或包含数据库文件。
include_once(db_connetc.php');
OR
// 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
mysql_query($query_variable);
。答案 29 :(得分:4)
试试这段代码就可以了。
将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'];
}
}
答案 30 :(得分:3)
因为$ username是一个php变量,我们需要将它作为字符串传递给mysqli所以因为在查询中你用单引号开始我们将使用双引号,单引号和一个完整的连接用于连接目的(&#34) ;&#39;。$ username。&#39;&#34;)如果您以双引号开头,则会反转引号(&#39;&#34;。$ username。&#34;&# 39。)
$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'];
}
$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的使用已经贬值很多,而是使用PDO。它很简单但非常安全
答案 31 :(得分:0)
传统上,PHP容忍错误做法和代码失败,
这使得调试非常困难。
在此特定情况下的问题是 mysqli 和 PDO
默认情况下,不告诉您查询何时失败,仅返回FALSE
。
(我不会谈论描述过的 mysql 扩展。
对准备好的语句的支持是可以切换到 PDO 或 mysqli 的原因。)
但是您可以更改PHP的默认行为,以在查询失败时始终抛出异常。
对于 PDO :使用$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
error_reporting(E_ALL);
$pdo = new PDO("mysql:host=localhost;dbname=test", "test","");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$result = $pdo->query('select emal from users');
$data = $result->fetchAll();
这将向您显示以下内容:
致命错误:消息“ SQLSTATE [42S22]”的未捕获异常“ PDOException”:未找到列:1054 E:\ htdocs \ test \ mysql_errors \ pdo.php中的“字段列表”中的未知列“ emal” 8
PDOException:SQLSTATE [42S22]:找不到列:1054第8行E:\ htdocs \ test \ mysql_errors \ pdo.php中“字段列表”中的未知列“ emal”
如您所见,它准确地告诉您查询出了什么问题以及在代码中的哪些位置进行修复。
没有$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
你会得到
致命错误:在第9行的E:\ htdocs \ test \ mysql_errors \ pdo.php中的布尔值上调用成员函数fetchAll()
对于 mysqli :使用mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
error_reporting(E_ALL);
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'test', '', 'test');
$result = $mysqli->query('select emal from users');
$data = $result->fetch_all();
您会得到
致命错误:在E:\ htdocs \ test \ mysql_errors \ mysqli.php的第8行上出现未捕获的异常'mysqli_sql_exception',消息为'字段列表中的'未知列'emal'
mysqli_sql_exception:在第8行的E:\ htdocs \ test \ mysql_errors \ mysqli.php中“字段列表”中的未知列“ emal”
没有mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
,您只会得到
致命错误:在第10行的E:\ htdocs \ test \ mysql_errors \ mysqli.php中以布尔值调用成员函数fetch_all()
当然,您可以手动检查MySQL错误。 但是如果我每次输入错字都必须这样做,我会发疯的- 或更糟糕的是,每次我要查询数据库时。