我试图从MySQL表中 Select 数据,但收到以下错误消息之一:

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

推荐答案

查询可能会因各种原因而失败,在这种情况下,mysql_*和mysqli扩展都将从各自的查询函数/方法返回false.您需要测试该错误条件,并相应地进行处理.

100:

NOTE在php版本7中删除了mysql_ functions are deprecatedmysql_ functions are deprecated.

判断$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
procedural style:

$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-style:

$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 ) {
      ...

using a prepared statement:

$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.

Php相关问答推荐

在WooCommerce中执行一次银行电汇确认付款代码

PHP Array to Powershell exec命令Args

让所有具有相同名称的产品在WooCommerce中更改价格

WooCommerce数量减号和加号图标未显示

从WooCommerce订单状态更改更新用户自定义元数据

如何不重新查询模型A-&>;相关模型B-&>模型

如何在微软图形API中使用用户S访问令牌或基于租户ID的访问令牌?

文本到语音:不考虑音高值

API 平台 - UI 服务器端点定义

Google Drive API 服务->文件->get('root') 失败并显示找不到文件. (范围问题?)

在 WooCommerce 管理变量产品中启用其他变体图像

加载 Xdebug PHP 7.4.0 失败

当所有对象都属于同一类型时,我可以省略 PHP in_array() 中的 strict 参数吗?

htaccess Rewriterule 无法以任何方式工作

Composer自动加载器重复了子类的类文件路径

为WooCommerce中的运输方式ID设置必填的 checkout 订单备注字段

如何使用动态变量定义 bind_result?

如何用 php ML 解决这个问题?

Laravel - 关联与设置观察者事件的 ID

使用 OOP PHP 创建动态 WHERE 子句.如何实现 BETWEEN 运算符?