PHP mysqli_fetch_assoc没有返回正确的值
我有一个旧的PHP代码,其中包含mysql 它从SELECT语句中获取一个数组,将其作为属性添加到JSON对象中,并回显编码的JSON 我将其改为使用mysqli,但当我尝试获取行并从中创建数组时,它只返回一个值 下面是旧的mysql代码:PHP mysqli_fetch_assoc没有返回正确的值,php,mysql,arrays,json,mysqli,Php,Mysql,Arrays,Json,Mysqli,我有一个旧的PHP代码,其中包含mysql 它从SELECT语句中获取一个数组,将其作为属性添加到JSON对象中,并回显编码的JSON 我将其改为使用mysqli,但当我尝试获取行并从中创建数组时,它只返回一个值 下面是旧的mysql代码: $con = mysql_connect('host','account','password'); if (!$con) { //log my error }; mysql_select_db("database_name", $con); my
$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
}
Version2:我尝试的第二件事,它只返回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对象
以后编辑:
好啊找到了一个有效的解决方案
另外,我处理了数据,选择了一个较小的块,它突然起作用了。由此得出的教训:对于40行或5行,函数的响应方式不同。它是否与php.ini设置有关?或者选择中可能有非法字符?“Note”列(来自数据库)的长度是否太长,数组无法处理
下面是工作代码块,它从数据库中选择一些行,将它们放入一个数组,然后将该数组放入一个对象,该对象最后编码为JSON,旁边有一条statusmessage。可以改进,但这只是演示
$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”似乎是正确的,但您需要实际处理错误-无论是在连接时还是在执行查询时。这样做会告诉您,您实际上并没有查询表,查询中的tablename缺少
连接时使用mysqli\u connect\u error()
,查询时使用mysqli\u error($con)
返回实际错误。通用PHP错误报告也可能对您有所帮助
下面的代码假定$参数
是在此代码之前定义的
$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);
在文件的顶部,直接在之后定义$con
?它连接正确吗?你的选择查询是什么,你知道它在工作吗?嗨$con是连接处理程序,当它到达这一点时,它正在工作。SELECT也可以工作,因为我试着将它打印出来,然后粘贴到MYSQL workbench中,它似乎可以工作?你的错误是什么?目前有太多的未知数。启用错误报告并显示代码的所有相关部分(包括连接、如何使用此代码和实际查询)。您好!我把问题更新了一点。我打开了错误报告,在这个脚本中有0个错误。一切似乎都很好。实际上,在我返回数组之后,我会进行打印计数($array);并正确显示数字。但当我将结果数组添加到对象时,它会默默地失败。。。
$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;
}