mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows 等...期望参数1是资源
Posted
技术标签:
【中文标题】mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows 等...期望参数1是资源【英文标题】:mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... expects parameter 1 to be resource 【发布时间】:2012-07-25 08:03:19 【问题描述】:我正在尝试从 mysql 表中选择数据,但收到以下错误消息之一:
mysql_fetch_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'];
【问题讨论】:
你可以使用:: QUERY or die(mysql_error()); 获得更有用的 eroor msg; 还有一个强制性说明:您的代码很容易出现SQL injection。您应该验证和/或转义用户输入。看看mysql_real_escape_string
。 永远不要相信用户数据。
其实OP的代码会在MySQL服务器上造成语法错误,但至少它不容易容易受到SQL注入的影响,因为单引号没有变量插值。
@FelixKling 我意识到这已经很老了,而且可能是当时最准确的,但你的评论现在在一个方面是危险的错误:mysql_real_escape_string
不是全部和结束-所有的SQL注入保护;它仍然容易受到许多攻击。 (不,你从未说过它是完美的,但你暗示它是唯一需要的解决方案)据我所知,现在最好的解决方案是 PDO。
嘎。将此问题扩展到包括 MySQLi 和 PDO 是一个坏主意。他们每个人都有自己稍微不同的语法和错误消息,他们很可能有自己的问题。将所有内容组合成一个巨大的由三部分组成的问题只会降低 Google 的可用性,并迫使到达这里的人通过不相关的内容来获得他们想要的东西。它也使下面的许多答案无效,并按照我们通常适用的标准使这个问题“过于宽泛”。在我看来,这是一团糟,但现在修复为时已晚。
【参考方案1】:
如果您在这里尝试了所有方法,但都不起作用,您可能需要检查您的 MySQL 数据库排序规则。我的设置为瑞典排序规则。然后我把它改成了utf8_general_ci
,一切都刚刚好。
【讨论】:
【参考方案2】:任何时候你得到...
“警告: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; // 1054 Unknown column 'foo' in 'field list'
// handle error
如果出现问题,您可以吐出一条错误消息,将您直接带到问题所在。在这种情况下,表中没有foo
列,解决问题很简单。
如果您愿意,您可以将此检查包含在函数或类中,并通过如前所述优雅地处理错误来扩展它。
【讨论】:
你怎么写“只要确保你优雅地处理错误,并且永远不要向你的用户透露任何问题的真正原因。”和echo $error;
在一篇文章中?
感谢@PaulSpiegel 的提醒。我已经有一段时间没有写或重新访问答案了,我错过了我把回声留在那里。【参考方案3】:
传统上,PHP 一直容忍代码中的不良做法和错误,
这使得调试非常困难。
在这种特定情况下的问题是 mysqli 和 PDO
默认情况下不会告诉你,当查询失败时只返回FALSE
。
(我不会谈论被贬低的 mysql 扩展。
对 prepared statements 的支持足以切换到 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();
这将显示以下内容:
致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42S22]:未找到列:1054 Unknown column 'emal' in 'field list'' in E:\htdocs\test\mysql_errors\pdo.php 在线8
PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'emal' in 'field list' in E:\htdocs\test\mysql_errors\pdo.php on line 8
如您所见,它准确地告诉您查询出了什么问题,以及在代码中的何处修复它。
没有$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' 和消息 'Unknown column 'emal' in 'field list''
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 错误。 但如果我每次打错字都必须这样做,我会发疯的—— 或更糟 - 每次我想查询数据库时。
【讨论】:
【参考方案4】:通常当您的数据库连接失败时会发生错误,因此请务必连接您的数据库或包含数据库文件。
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);
。
【讨论】:
1) 你不知道我是否对这里的任何答案投了赞成票或反对票。 2)正如我在第一条评论中解释的那样;您的答案没有引用问题(boolean 传递给 mysql_fetch_array)并且您有语法错误 两个代码示例中的引号都不正确。应用于您的第二个代码块的语法突出显示是一个死的赠品,表明有问题 此代码存在SQL注入,请勿使用。 @EngrZardari 如果您在生产系统上使用此代码,那么您无疑已被黑客入侵,应该使用 PDO 或类似的准备好的/参数化查询来补救这种情况。有些机器人可以自动测试此类漏洞。 @EngrZardari 关于您的“没有任何错误,我已在此处粘贴我当前使用的代码。” comment 以上。我更正了查询中缺少的报价。那会引发 (PHP) 解析错误。【参考方案5】:查询可能由于各种原因而失败,在这种情况下,mysql_* 和 mysqli 扩展都会从各自的查询函数/方法返回 false
。您需要测试该错误情况并进行相应处理。
mysql_* extension:
注意 mysql_ functions are deprecated 已在 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 extension程序风格:
$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。此外,不应向非管理员用户显示数据库错误消息,因为它是 discloses too much information。
【讨论】:
对,但是如果查询失败,使用 die() 有点多。 我打算为 OP 设计一个完整的错误处理机制,但决定这可能超出了我的回答范围。 @scompt.com 是的,它也包含在其他几个答案中。我想我只是想说,因为这是对一个高知名度问题的接受答案,除了关于如何在未来正确捕获错误的(优秀)建议之外,它应该(恕我直言)实际回答具体问题(即解释为什么在这种情况下会出错)。 您可以使用if(! $result)
而不是if($result === FALSE)
。如果我错了,请纠正我
mysql_query():mysql 扩展已弃用,将来会被删除:使用 mysqli【参考方案6】:
试试这个
$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'];
【讨论】:
@panjehra mysql_* 现在已弃用,将从 php 7 中删除。改用 mysqli_*【参考方案7】:这里发生的错误是由于使用了单引号 ('
)。您可以像这样提出查询:
mysql_query("
SELECT * FROM Users
WHERE UserName
LIKE '".mysql_real_escape_string ($username)."'
");
它使用mysql_real_escape_string
来防止SQL 注入。
虽然对于 PHP 的升级版本(PHP 5.5.0 及更高版本)我们应该使用 MySQLi 或 PDO_MYSQL 扩展,但对于旧版本 mysql_real_escape_string
会解决问题。
【讨论】:
为什么要在字符串连接中添加噪音而不是仅仅将变量放入查询字符串中? @Matteo Riva 是的,但我认为这是将变量与字符串分开的更简洁的方法。 :)【参考方案8】:因为 $username 是一个 php 变量,我们需要将它作为字符串传递给 mysqli,所以在查询中你以单引号开头,我们将使用双引号、单引号和句号来进行连接(“'. $username.'") 如果您以双引号开头,那么您将反转引号 ('".$username."')。
$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吧,简单但很安全
【讨论】:
但是Mysql使用已经贬值了。您可以改用 PDO。让我给你一个登录示例。 密码永远不应该以纯文本形式存储,利用 PHP 处理密码哈希和验证哈希密码的内置函数! 不要使用此代码。它很容易受到 SQL 注入攻击。【参考方案9】:试试这个,它一定可以工作,否则你需要打印错误来说明你的问题
$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'];
【讨论】:
1) 对 SQL 注入开放,2) 不包括在 OP 的情况下导致错误的错误处理。 +1。 @deceze 是的,它是敞开的。但不再是 OP 或接受的回答者的代码 ;-) 并不是 OP 的代码中缺少错误 处理 导致错误......它是 错误 , 这个答案至少试图解决这个问题(通过在LIKE
表达式中的字符串文字周围加上单引号)。
+1 请在 LIKE 和 '$username' 之间添加一个空格,除了 SQL 注入之外,其余的似乎都很好。为什么不用 = 而不是 LIKE 运算符用户名必须完全匹配【参考方案10】:
不要使用已弃用的 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();
?>
【讨论】:
您的帖子没有处理问题所解决的问题,即无效查询和错误报告不足。这篇文章离题了。【参考方案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'];
?>
【讨论】:
【参考方案12】:在 MySQL 查询之前包含一个连接字符串变量。例如这段代码中的$connt
:
$results = mysql_query($connt, "SELECT * FROM users");
【讨论】:
这并没有解决问题中的问题。这也是错误的,会引发另一个错误。【参考方案13】:当您的查询中有错误导致查询失败时,会显示此错误消息。它会在使用时表现出来:
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_*
函数不应用于新代码。它们不再维护,社区已经开始deprecation process。相反,您应该了解prepared statements 并使用PDO 或MySQLi。如果您无法决定,this article 将帮助您选择。如果你想学习,这里是good PDO tutorial。
【讨论】:
今天提出这个问题***.com/q/43804651/1415724 和最近的其他类似问题;我认为更新您的答案以包含类似 “该错误也可能是由于未使用mysql_query()
/ mysqli_query($connection)
等执行查询而导致的。”;想法?由于此问答中没有其他答案提到这一点。【参考方案14】:
如果您在检查时没有出现任何 MySQL 错误,请确保您正确创建了数据库表。这发生在我身上。查找任何不需要的逗号或引号。
【讨论】:
【参考方案15】:$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 查询。使用查询比这要好得多。
我已经完成了这个查询,并且没有收到参数或布尔值之类的错误。
【讨论】:
记得在 HTML 上下文中使用任意数据时使用htmlspecialchars()
。否则,当数据中使用保留字符时,您可能会创建有效的 HTML。【参考方案16】:
使用 db_close() 确保您没有关闭数据库 运行您的查询:
如果您在脚本中使用多个查询,即使您包含包含查询或数据库连接的其他页面,那么您可能会在任何地方使用 db_close() 来关闭您的数据库连接,因此请确保你没有在你的脚本中犯这个错误。
【讨论】:
【参考方案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'];
【讨论】:
此代码受到SQL注入攻击,不应使用。【参考方案18】:作为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 注入。
【讨论】:
【参考方案19】:<?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."'");
【讨论】:
此代码对 SQL 注入开放,不应使用。 @AnujGarg 此代码接受直接输入并将其连接到查询中。有人可以在username
的 post 数据中编写自己的 SQL,它将被执行。
那么用什么来防止代码被SQL注入呢?【参考方案20】:
首先检查您的连接。
那么如果你想从数据库中获取准确的值,那么你应该这样写:
$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%'");
【讨论】:
此代码对 SQL 注入开放,不应使用。【参考方案21】:试试下面的代码。它可能工作正常。
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'");
while($row = mysql_fetch_array($result))
echo $row['FirstName'];
【讨论】:
此代码存在SQL注入,请勿使用。【参考方案22】:可能有两个原因:
在调用 mysql_query 函数之前,您是否打开了与数据库的连接?我在你的代码中没有看到。在进行查询之前使用 mysql_connect。见php.net/manual/en/function.mysql-connect.php
变量 $username 在单引号字符串中使用,因此不会在查询中计算其值。查询肯定会失败。
第三,查询的结构容易出现SQL injection。您可以使用准备好的语句来避免这种安全威胁。
【讨论】:
【参考方案23】:首先,检查您与数据库的连接。是否连接成功?
如果完成了,那么之后我已经编写了这段代码,并且运行良好:
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;
【讨论】:
不要使用此代码。它很容易受到 SQL 注入攻击。【参考方案24】:$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);
【讨论】:
不要使用此代码。它很容易受到 SQL 注入攻击。【参考方案25】:转到您的config.php
。我有同样的问题。验证用户名和密码,并且sql select和config同名。
【讨论】:
【参考方案26】:在执行 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'];
【讨论】:
不要使用此代码。它很容易受到 SQL 注入攻击。 但是如果代码有效,我觉得你应该编辑代码并输入所需的过滤器而不是谴责代码。 过滤器的简单使用并不能解决此代码的问题。最好的解决方案是使用 PDO 或类似的准备好的/参数化查询。我认为修复它没有任何意义,因为正确的答案已经发布在这里。理想情况下,此答案将被删除。但是,欢迎您修正您的答案,如果它是正确的,我会很高兴地投票。 好吧,如果您觉得答案不值得考虑,您可以继续阅读。但是,我认为这个社区的全部意义在于分享和贡献知识。如果您有东西要分享,而不是展示和让人们失望。 你是对的,这个社区的全部意义在于分享知识。这就是为什么在我的反对票中添加了解释,并进一步解释了为什么您的过滤器建议不够充分。我更愿意提醒您以及其他任何找到您答案的人,上面的代码是不安全的。每个人都最好学习正确的方法,而不是延续糟糕的代码。而且,我不能删除你的答案,我也不会。这取决于你,如果你选择这样做。【参考方案27】:这个查询应该可以工作:
$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 现已弃用。
【讨论】:
【参考方案28】:请检查一次选择的数据库不是因为有时没有选择数据库
检查
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());
【讨论】:
【参考方案29】:$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 等将无法处理结果,因为这不是结果!即:
$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 了解更多信息。
【讨论】:
请勿使用此代码,即使您添加了引号。它很容易受到 SQL 注入攻击。【参考方案30】:你的代码应该是这样的
$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'];
完成此操作后,您将在屏幕上打印查询。在您的服务器上尝试此查询,看看它是否产生所需的结果。大多数情况下,错误出现在查询中。其余代码正确。
【讨论】:
不要使用此代码。它很容易受到 SQL 注入攻击。以上是关于mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows 等...期望参数1是资源的主要内容,如果未能解决你的问题,请参考以下文章
mysql_fetch_array、mysql_fetch_assoc、mysql_fetch_object
如何在表中显示 mysql 多行/mysql_fetch_array 结果?
什么改变了循环中的条件:while (mysql_fetch_array($var))?