我正在编写一个与MySQL数据库通信的PHP脚本,并将结果格式化为一个字符串,可以通过我正在构建的Objective-C框架进行解析。
目前我正在努力让多个陈述/结果发挥作用,但我在这里遇到了一些麻烦。
我发送3个语句作为多语句:
SELECT * FROM table
(返回结果集)SELECT field FROM table
(返回结果集)INSERT INTO table VALUES value
(应该返回重复的错误) do while循环被调用两次,前两个语句中的每一个都调用一次,但是INSERT
语句不会第三次调用它。
if ($mysql->more_results()) {
echo("MULTIRESULT|*|".mysqli_errno($mysql)."|*|".mysqli_error($mysql)."|*|");
$i4 = 0;
do {
if ($i4 != 0) {
echo("|&|");
}
$result = $mysql->store_result();
if ($result) {
echo("RESULTSET|%|");
$i1 = 0;
while ($field = $result->fetch_field()) {
if ($i1 != 0) {
echo("|+|");
} echo($field->name."|@|".$field->orgname."|@|".$field->table."|@|".$field->orgtable."|@|".$field->db."|@|".$field->catalog."|@|".$field->def."|@|".$field->length."|@|".$field->maxlength."|@|".$field->flags."|@|".$field->decimals."|@|".$field->charsetnr."|@|".$field->type);
$i1++;
}
echo("|~|");
$i2 = 0;
while ($row = $result->fetch_row()) {
if ($i2 != 0) {
echo("|+|");
}
$fieldcount = $mysql->field_count;
for ($i3 = 0; $i3 < $fieldcount; $i3++) {
if ($i3 != 0) {
echo("|@|");
} echo($row[$i3]);
}
$i2++;
}
} else if ($mysql->field_count == 0) {
echo("AFFECTEDROWS|%|".$mysql->affected_rows);
} else {
echo("UNSUCCESSFUL|%|".mysqli_errno($mysql)."|%|".mysqli_error($mysql));
} $result->close();
$i4++;
} while ($mysql->next_result());
}
对于处理单个语句的代码,这可以正常工作。没有结果,mysqli_field_count
不是0,所以它回应了以UNSUCCESSFUL开头的那一行。
$result = $mysql->store_result();
if ($result) {
echo("RESULTSET|*|".mysqli_errno($mysql)."|*|".mysqli_error($mysql)."|*|");
$i1 = 0;
while ($field = $result->fetch_field()) {
if ($i1 != 0) {
echo("|+|");
} echo($field->name."|@|".$field->orgname."|@|".$field->table."|@|".$field->orgtable."|@|".$field->db."|@|".$field->catalog."|@|".$field->def."|@|".$field->length."|@|".$field->maxlength."|@|".$field->flags."|@|".$field->decimals."|@|".$field->charsetnr."|@|".$field->type);
$i1++;
}
echo("|~|");
$i2 = 0;
while ($row = $result->fetch_row()) {
if ($i2 != 0) {
echo("|+|");
}
$fieldcount = $mysql->field_count;
for ($i3 = 0; $i3 < $fieldcount; $i3++) {
if ($i3 != 0) {
echo("|@|");
} echo($row[$i3]);
}
$i2++;
}
} elseif ($mysql->field_count == 0) {
echo("AFFECTEDROWS|*|".mysqli_errno($mysql)."|*|".mysqli_error($mysql)."|*|".$mysql->affected_rows);
} else {
echo("UNSUCCESSFUL|*|".mysqli_errno($mysql)."|*|".mysqli_error($mysql));
} $result->close();
我想说这是因为mysqli_next_result
仅在有结果集的情况下有效,但是当我在没有重复的情况下执行INSERT
语句时,会为该语句调用do while循环
我对这个问题一无所知,我甚至不知道如何提出我的问题,但我想这里的问题非常明显。
答案 0 :(得分:1)
如果您希望PHP,mySQL和Objective C进行通信,我肯定会建议将此方法更改为更简单的方法。
在我看来,发送和接收JSON是处理PHP和Objective C之间通信的最佳方法。当你从mysql收到结果时,你所编写的内容可以简化。
例如:
如果您希望将整个SELECT语句发送到Objective C,我会使用
fetch_object()
而不是fetch_field()
,然后回显json_encode()
以输出一个格式,该格式将包含Objective C需要解码的所有内容
[NSJSONSerialization JSONObjectWithData:data];
希望能让你指出正确的问题。
答案 1 :(得分:1)
您在代码} $result->close();
和documentation中有这一行似乎$result
是mysqli_result对象,close()
函数是} $result->free();
不属于这个班级。
也许您需要将该行更改为{{1}}?
我希望它会有所帮助