【问题标题】:MySQL/PHP multi query: 3 statements, 2 resultsMySQL/PHP 多查询:3 个语句,2 个结果
【发布时间】: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。

标签: php mysql mysqli


【解决方案1】:

如果您希望 PHP、mySQL 和 Objective C 进行通信,我肯定会建议将此方法更改为更简单的方法。

在我看来,发送和接收 JSON 是处理 PHP 和 Objective C 之间通信的最佳方法。当您从 mysql 接收结果时,可以简化您编写的内容。

例如:

如果您希望将整个 SELECT 语句发送到 Objective C,我会使用 fetch_object() 而不是 fetch_field(),然后回显 json_encode() 以输出一种格式,该格式将包含 Objective C 需要使用的所有内容进行解码

[NSJSONSerialization JSONObjectWithData:data];

希望这能给你指明要问的正确问题的方向。

【讨论】:

  • 这看起来很简单。我以前从未使用过 JSON,但我一定会研究它。
  • 真的很简单。乐意效劳。请检查最有价值的解决方案并关闭。
【解决方案2】:

您在代码} $result-&gt;close(); 中有这一行,从documentation 看来$resultmysqli_result 对象,而close() 函数不属于此类。

也许您需要将该行更改为} $result-&gt;free();

希望对你有帮助

【讨论】:

  • 好眼力,我改了,没解决问题可能是内存泄漏大了。
猜你喜欢
  • 2017-11-29
  • 1970-01-01
  • 2016-01-04
  • 2010-11-21
  • 1970-01-01
  • 2013-11-03
  • 2015-02-07
  • 2023-03-16
相关资源
最近更新 更多