mysql\u fetch\u array()/mysql\u fetch\u assoc()/mysql\u fetch\u row()/mysql\u num\u rows等等期望参数1是资源

6xfqseft  于 2021-06-18  发布在  Mysql
关注(0)|答案(24)|浏览(529)

我试图从mysql表中选择数据,但收到以下错误消息之一:
mysql\u fetch\u array()期望参数1是资源,给定布尔值
这是我的密码:

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

2q5ifsrm1#

加引号 $username . 与数值相反,字符串值必须用引号括起来。

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

而且,使用 LIKE 条件如果你不使用通配符:如果你需要一个完全匹配的使用 = 而不是 LIKE .

vybvopom

vybvopom2#

任何时候你得到。。。
警告:mysqli\u fetch\u object()期望参数1是mysqli\u 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; // 1054 Unknown column 'foo' in 'field list'
    // handle error
}

如果出了问题,你可以吐出一条错误信息,直接把你带到问题上。在这种情况下,没有 foo 列中,解决问题是琐碎的。
如果您选择,您可以将此检查包含在函数或类中,并通过优雅地处理前面提到的错误来扩展它。

t1rydlwq

t1rydlwq3#

请尝试以下代码。它可能工作得很好。

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

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

6mw9ycah4#

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

使用单引号定义字符串,php不解析单引号分隔的字符串。为了获得变量插值,需要使用双引号或字符串串联(或两者的组合)。看到了吗http://php.net/manual/en/language.types.string.php 更多信息。
您还应该检查mysql\u query是否返回了有效的结果资源,否则fetch\u*、num\u rows等将无法处理结果,因为这不是结果!即:

$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 更多信息。

5q4ezhmt

5q4ezhmt5#

去你的房间 config.php . 我也有同样的问题。验证用户名和密码,并且sqlselect与配置的名称相同。

polkgigr

polkgigr6#

一个查询可能会因为各种原因而失败,在这种情况下mysql和mysqli扩展都会返回 false 从各自的查询函数/方法。您需要测试错误条件并相应地处理它。
mysql扩展名:
注意mysql函数已经被弃用,在phpversion7中已经被删除。
检查 $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 ) {
      ...

这些例子只是说明应该做什么(错误处理),而不是如何做。生产代码不应使用 or die 当输出html时,它将(至少)生成无效的html。此外,数据库错误消息不应该显示给非管理员用户,因为它会泄露太多信息。

vmjh9lq9

vmjh9lq97#

此查询应适用于:

$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\u connect,它现在已经被去擦洗了。

30byixjq

30byixjq8#

首先,检查与数据库的连接。是否连接成功?
如果完成了,那么在那之后我就编写了这段代码,而且效果很好:

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

8zzbczxx9#

正如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注入。

aelbi1ox

aelbi1ox10#

由于有时数据库未被选中,请检查是否有选中的数据库
检查

mysql_select_db('database name ')or DIE('Database name is not available!');

然后进行下一步

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

f($result === FALSE) {
    die(mysql_error());
fcipmucu

fcipmucu11#

这里发生的错误是由于使用了单引号( ' ). 您可以将查询如下:

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

它正在使用 mysql_real_escape_string 用于防止sql注入。虽然我们应该使用mysqli或pdoïumysql扩展来升级php版本(php5.5.0及更高版本),但是对于旧版本 mysql_real_escape_string 会成功的。

wnrlj8wa

wnrlj8wa12#

你的代码应该是这样的

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

完成后,您将在屏幕上打印查询。在您的服务器上尝试此查询,看看是否产生所需的结果。大多数情况下,错误都出现在查询中。其余代码是正确的。

ltskdhd1

ltskdhd113#

当查询中出现导致失败的错误时,将显示此错误消息。它将在使用时显示: 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教程。

yx2lnoni

yx2lnoni14#

不要使用去擦洗mysql_ux*函数(PHP5.5中的去擦洗将在PHP7中删除)。你可以用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();
?>
jljoyd4f

jljoyd4f15#

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

相关问题