【发布时间】:2014-02-26 22:57:16
【问题描述】:
我正在编写一个与 MySQL 数据库通信的 php 脚本,并将结果格式化为一个字符串,该字符串可由我正在构建的 Objective-C 框架解析。
目前我正在尝试让多个语句/结果起作用,但我在这里遇到了一些麻烦。
我将 3 个语句作为多语句发送:
-
SELECT * FROM table(返回结果集) -
SELECT field FROM table(返回结果集) -
INSERT INTO table VALUES value(应该返回重复错误)
do while 循环被调用了两次,前 2 个语句中的每一个都调用一次,但是对于 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 循环。
我对这个问题一无所知,我什至不知道如何提出我的问题,但我想这里的问题很明显。
【问题讨论】:
-
如果
INSERT发出错误,我不希望它返回一个(甚至是空的)结果集。相反,如果它通过,数据库可能会返回一个空的结果集。这可能会解释你的问题,但因为我几乎不明白你想要实现什么......你看过这个:stackoverflow.com/questions/7395326/… 吗?在我看来,一旦出现错误,多查询的执行就会结束。 -
使用 json 进行 RESTful 通信,操作数据会更容易,发送和接收数据会更轻松/更快
-
我以前从未使用过 JSON,我可能会研究一下,看看如何在我的项目中使用它。目前我正在用 [string componentsSeparatedByString:@"|*|"] 解析我的字符串。不过,似乎需要做很多工作,将所有内容都更改为 JSON。