MySQL / PHP多查询:3个语句,2个结果

时间:2014-02-26 22:57:16

标签: php mysql mysqli

我正在编写一个与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循环

我对这个问题一无所知,我甚至不知道如何提出我的问题,但我想这里的问题非常明显。

2 个答案:

答案 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中有这一行似乎$resultmysqli_result对象,close()函数是} $result->free();不属于这个班级。

也许您需要将该行更改为{{1}}?

我希望它会有所帮助