gpt4 book ai didi

PHP mysqli_fetch_assoc 没有返回正确的值

转载 作者:行者123 更新时间:2023-11-29 02:45:38 26 4
gpt4 key购买 nike

我有一个旧的 PHP 代码,里面有 mysql。

它从 SELECT 语句获取数组,将其作为属性添加到 JSON 对象并回显编码后的 JSON。

我将其更改为使用 mysqli,但是当我尝试获取行并从中创建一个数组时,它什么也没有返回。

这是旧的 mysql 代码:

$con = mysql_connect('host','account','password');
if (!$con)
{
//log my error
};

mysql_select_db("database_name", $con);
mysql_set_charset('utf8');
$sql = "SELECT field1 as Field1, field2 as Field2 from table where ID = '".$parameter."'";
$query = mysql_query($sql);
$results = array();
while($row = mysql_fetch_assoc( $query ) )
{
$results[] = $row;
}
return $results;

版本 1:这是我尝试编写的新版本:

$con = mysqli_connect('host','account','password','database_name');
$sql = "SELECT field1 as Field1, field2 as Field2 from table where ID = '".$parameter."'";
$results = array();
if($result=mysqli_query($con, $sql))
{
while ($row=mysqli_fetch_assoc($result))
{
$results[] = $row;
}
return $results;
}
else
{
//error
}

版本 2:我尝试的第二件事,它只返回 1 行:

...same as above until $sql
if($result=mysqli_query($con,$sql))
{
$row=mysqli_fetch_assoc($result);
return $row;
}

版本 3:或者我尝试像这样完全镜像 mysql 结构:

$sql = "SELECT ...";
$query = mysqli_query($con, $sql);
$results = array();
while($row = mysqli_fetch_assoc( $query ) )
{
$results[] = $row;
}
return $results;

将结果数组包装到 JSON 中:

$obj = new stdClass();
$obj->Data = $results;
$obj->ErrorMessage = '';
die(json_encode($obj)); //or echo json_encode($obj);

所有 mysqli 版本都无法正常工作,所以我认为这些数组的创建方式可能会发生重大变化。

关于第一个 mysqli 示例可能出错的任何提示?

对于 Version2,我可以看出存在 SQL 连接,而且我至少可以选择一行。但它显然只有一行,而不是返回它。这让我觉得,构建数组是问题的根源,或者它与 JSON 对象有关......

后期编辑:好的!找到了一个可行的解决方案。

此外,我研究了这些数据,选择了一个较小的 block ,然后它突然起作用了。从中得到的教训:函数对 40 行或 5 行的响应方式不同。它与 php.ini 设置有关吗?或者选择中可能有非法字符?会不会是“注释”列(来自数据库)的长度太长,数组无法处理?

这是工作代码块,它从数据库中选择一些行,将它们放入一个数组中,然后将该数组放入一个对象中,该对象最后编码为 JSON,旁边有一个状态消息。可以改进,但这只是为了演示。

$con = mysqli_connect('host','username','password','database_name');
if (!$con)
{
$errorMessage = 'SQL connection error: '.$con->connect_error;
//log or do whatever.
};
$sql = "SELECT Field1 as FieldA, field2 as FieldB, ... from Table where ID='something'";

$results = array();

if($result = mysqli_query($con, $sql))
{
while($row = mysqli_fetch_assoc($result))
{
$results[] = $row;
}
}
else
{
//log if it failed for some reason
die();
}

$obj->Data = $results;
$obj->Error = '';
die(json_encode($obj));

问题是:我怎样才能克服有关数组大小/非法字符的问题(如果是这样的话)?

最佳答案

从 PHP 的角度来看,您的“版本 1”似乎是正确的,但您需要实际处理错误 - 无论是在连接时还是在执行查询时。这样做会告诉您您实际上并没有查询表,您丢失了 FROM tablename在查询中。

使用 mysqli_connect_error()连接时,mysqli_error($con)查询以取回实际错误时。一般 PHP 错误报告也可能对您有所帮助。

下面的代码假定 $parameter在此代码之前定义。

$con = mysqli_connect('host','account','password','database_name');
if (mysqli_connect_errno())
die("An error occurred while connecting: ".mysqli_connect_error());

$sql = "SELECT field1 as Field1, field2 as Field2
FROM table
WHERE ID = '".$parameter."'";

$results = array();
if ($result = mysqli_query($con, $sql)) {
while ($row = mysqli_fetch_assoc($result)) {
$results[] = $row;
}
return $results;
} else {
return mysqli_error($con);
}

报错

添加

error_reporting(E_ALL);
ini_set("display_errors", 1);

在文件的顶部,紧跟在 <?php 之后将使您能够得到 PHP 错误。

NOTE: Errors should never be displayed in a live environment, as it might be exploited by others. While developing, it's handy and eases troubleshooting - but it should never be displayed otherwise.

安全

您还应该注意,此代码容易受到 SQL 注入(inject)攻击,您应该使用带占位符的参数化查询来保护自己免受攻击。使用准备好的语句,您的代码将如下所示:

$con = mysqli_connect('host','account','password','database_name');
if (mysqli_connect_errno())
die("An error occurred while connecting: ".mysqli_connect_error())

$results = array();

if ($stmt = mysqli_prepare("SELECT field1 as Field1, field2 as Field2
FROM table
WHERE ID = ?")) {
if (mysqli_stmt_bind_param($stmt, "s", $parameter)) {
/* "s" indicates that the first placeholder and $parameter is a string */
/* If it's an integer, use "i" instead */
if (mysqli_stmt_execute($stmt)) {
if (mysqli_stmt_bind_result($stmt, $field1, $field2) {
while (mysqli_stmt_fetch($stmt)) {
/* Use $field1 and $field2 here */
}
/* Done getting the data, you can now return */
return true;
} else {
error_log("bind_result failed: ".mysqli_stmt_error($stmt));
return false;
}
} else {
error_log("execute failed: ".mysqli_stmt_error($stmt));
return false;
}
} else {
error_log("bind_param failed: ".mysqli_stmt_error($stmt));
return false;
}
} else {
error_log("prepare failed: ".mysqli_stmt_error($stmt));
return false;
}

引用资料

关于PHP mysqli_fetch_assoc 没有返回正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42676526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com