命令不同步;现在不能运行此命令

q5lcpyga  于 2021-06-23  发布在  Mysql
关注(0)|答案(21)|浏览(423)

我正在尝试执行我的php代码,它通过mysqli调用两个mysql查询,并得到错误“命令不同步;现在不能运行此命令”。
这是我正在使用的代码

<?php
$con = mysqli_connect("localhost", "user", "password", "db");
if (!$con) {
    echo "Can't connect to MySQL Server. Errorcode: %s\n". Mysqli_connect_error();
    exit;
}
$con->query("SET NAMES 'utf8'");
$brand ="o";
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE % ? %";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s", $brand);
    $numRecords->execute();
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = $data->num_rows;
    $rows = getRowsByArticleSearch("test", "Auctions", " ");
    $last = ceil($rowcount/$page_rows);
}  else {

print_r($con->error);
}
foreach ($rows as $row) {
    $pk = $row['ARTICLE_NO'];
    echo '<tr>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['USERNAME'].'</a></td>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['shortDate'].'</a></td>' . "\n";
    echo '<td><a href="#" onclick="deleterec(\'Layer2\', \'' . $pk . '\')">DELETE RECORD</a></td>' . "\n";
    echo '</tr>' . "\n";
}
function getRowsByArticleSearch($searchString, $table, $max) {
    $con = mysqli_connect("localhost", "user", "password", "db");
    $recordsQuery = "SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME, date_format(str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), '%d %m %Y' ) AS shortDate FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE '%?%' ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s')" . $max;
    if ($getRecords = $con->prepare($recordsQuery)) {
        $getRecords->bind_param("s", $searchString);
        $getRecords->execute();
        $getRecords->bind_result($ARTICLE_NO, $USERNAME, $ACCESSSTARTS, $ARTICLE_NAME, $shortDate);
        while ($getRecords->fetch()) {
            $result = $con->query($recordsQuery);
            $rows = array();
            while($row = $result->fetch_assoc()) {
                $rows[] = $row;
            }
            return $rows;
        }
    }
}

我试过仔细阅读这篇文章,但我不知道该怎么办。我读过关于存储结果和免费结果的文章,但是在使用它们的时候它们并没有什么区别。我不确定这个错误究竟是在哪一点造成的,我想知道为什么会造成这个错误,以及如何修复它。
根据我的调试语句,countquery的第一个if循环甚至没有被输入,因为我的sql语法中有一个错误 '% ? %' . 但是如果我选择 * 我没有尝试基于like子句进行限制,而是仍然得到命令不同步错误。

im9ewurl

im9ewurl1#

检查输入的所有参数是否正确。如果定义并传递给函数的参数数量不同,则抛出相同的错误。

i7uq4tfw

i7uq4tfw2#

我的问题是,我使用的是第一个prepare语句,然后在同一页上使用mysqli查询,得到的错误是“命令不同步;现在不能运行此命令”。当我使用包含prepare语句的代码时,才出现错误。
我所做的就是结束这个问题。而且成功了。
mysqli\u stmt\u close($stmt);
我的代码
get_category.php(这里使用prepare语句)

<?php

    global $connection;
    $cat_to_delete =    mysqli_real_escape_string($connection, $_GET['get'] );

    $sql = "SELECT category_name FROM categories WHERE category_id = ? ;";

    $stmt = mysqli_stmt_init($connection);

    if (!mysqli_stmt_prepare($stmt, $sql))
        $_SESSION['error'] = "Error at preaparing for deleting query. mysqli_stmt_error($stmt) ." & redirect('../error.php');

    mysqli_stmt_bind_param($stmt, 's', $cat_to_delete);

    if (!mysqli_stmt_execute($stmt))
        $_SESSION['error'] = "ERror at executing delete category ".mysqli_stmt_error($stmt) &
            redirect('../error.php');

    mysqli_stmt_bind_result($stmt, $cat_name);

    if (!mysqli_stmt_fetch($stmt)) {
        mysqli_stmt_error($stmt);
    }

    mysqli_stmt_free_result($stmt);
    mysqli_stmt_close($stmt);

admin\u get\u category\u body.php(这里是mysqli)

<?php

        if (isset($_GET['get']) && !empty($_GET['get']) )
        {
            include 'intodb/edit_category.php';
        }

        if (check_method('get') && isset($_GET['delete']) )
        {
            require 'intodb/delete_category.php';
        }

        if (check_method('get') && isset($_GET['get']) )
        {
            require 'intodb/get_category.php';
        }

        ?>

        <!--            start: cat body          -->

        <div     class="columns is-mobile is-centered is-vcentered">
            <div class="column is-half">
                <div   class="section has-background-white-ter box ">

                    <div class="has-text-centered column    " >
                        <h4 class="title is-4">Ctegories</h4>
                    </div>

                    <div class="column " >

                        <?php if (check_method('get') && isset($_GET['get'])) {?>
                        <form action="" method="post">
                            <?php } else {?>
                            <form action="intodb/add_category.php" method="post">
                                <?php } ?>

                                <label class="label" for="admin_add_category_bar">Add Category</label>
                                <div class="field is-grouped">

                                    <p class="control is-expanded">

                                        <?php if (check_method('get') && isset($_GET['get'])) {?>

                                            <input id="admin_add_category_bar" name="admin_add_category_bar_edit" class="input" type="text" placeholder="Add Your Category Here" value="<?php echo $cat_name; ?>">

                                            <?php

                                            ?>
                                        <?php } else {?>
                                            <input id="admin_add_category_bar" name="admin_add_category_bar" class="input" type="text" placeholder="Add Your Category Here">

                                        <?php } ?>
                                    </p>
                                    <p class="control">
                                        <input type="submit" name="admin_add_category_submit" class="button is-info my_fucking_hover_right_arrow" value="Add Category">
                                    </p>
                                </div>
                            </form>

                            <div class="">

                                <!--            start: body for all posts inside admin          -->

                                <table class="table is-bordered">
                                    <thead>
                                    <tr>
                                        <th><p>Category Name</p></th>
                                        <th><p>Edit</p></th>
                                        <th><p>Delete</p></th>
                                    </tr>
                                    </thead>

                                    <?php

                                    global $connection;
                                    $sql = "SELECT * FROM categories ;";

                                    $result = mysqli_query($connection, $sql);
                                    if (!$result) {
                                        echo mysqli_error($connection);
                                    }
                                    while($row = mysqli_fetch_assoc($result))
                                    {
                                        ?>
                                        <tbody>
                                        <tr>
                                            <td><p><?php echo $row['category_name']?></p></td>
                                            <td>
                                                <a href="admin_category.php?get=<?php echo $row['category_id']; ?>" class="button is-info my_fucking_hover_right_arrow" >Edit</a>

                                            </td>

                                            <td>
                                                <a href="admin_category.php?delete=<?php echo $row['category_id']; ?>" class="button is-danger my_fucking_hover_right_arrow" >Delete</a>

                                            </td>
                                        </tr>

                                        </tbody>
                                    <?php }?>
                                </table>

                                <!--           end: body for all posts inside admin             -->

                            </div>

                    </div>
                </div>

            </div>

        </div>
        </div>

我突然想到,我还通过global$connection;再次添加了连接变量;。所以我认为在prepare语句以mysqli\u stmt\u close($stmt)结尾之后,基本上一套全新的查询系统正在启动;我还通过include添加了这些文件和其他东西

pzfprimi

pzfprimi3#

您不能同时有两个查询,因为mysqli在默认情况下使用无缓冲查询(对于准备好的语句;香草正好相反 mysql_query ). 您可以将第一个查询提取到一个数组中并在其中循环,或者告诉mysqli缓冲查询(使用 $stmt->store_result() ).
详见此处。

sd2nnvve

sd2nnvve4#

这就是我的问题所在!!!
param绑定是“动态”的,所以我有一个变量来设置数据的参数,以便使用bind\u param。所以这个变量是错误的,但不是抛出一个像“错误的参数数据”这样的错误,它说“不同步blablablabla”,所以我很困惑。。。

w8f9ii69

w8f9ii695#

我在我的c应用程序中解决了这个问题-我是这样做的:
引用mysql论坛:
当您在应用程序中使用分号分隔符终止查询时,会出现此错误。在命令行或查询浏览器中执行查询时,需要使用分号分隔符终止查询,但请从应用程序内部的查询中删除分隔符。
在运行我的查询并处理结果之后[c api: mysql_store_result() ],我将遍历通过多个sql语句执行(例如两个或多个select语句)出现的任何其他潜在的挂起结果(背对背,不处理结果)。
事实上,我的过程不会返回多个结果,但在我执行[c api: mysql_next_result() ]. 我在一个循环中这样做(为了更好的测量),直到它返回非零。此时,当前连接处理程序知道可以执行另一个查询(我缓存处理程序以最小化连接开销)。
这是我使用的循环:

for(; mysql_next_result(mysql_handler) == 0;) 
  /* do nothing */;

我不知道php,但我肯定它也有类似的东西。

c8ib6hqw

c8ib6hqw6#

要解决这个问题,必须先存储结果数据,然后再使用它

$numRecords->execute();

$numRecords->store_result();

这就是全部

mrfwxfqh

mrfwxfqh7#

这是一个老问题,但在我的例子中,没有一个发布的答案起作用,我发现在我的例子中,我对存储过程中的一个表进行了selects和updates,同一个表有一个update触发器,该触发器正在被触发,并将过程发送到一个无限循环中。一旦发现错误,错误就消失了。

gwbalxhn

gwbalxhn8#

我今天也遇到了同样的问题,但只是在处理存储过程时。这使得查询的行为类似于多重查询,因此在进行另一个查询之前,您需要“使用”其他可用的结果。

while($this->mysql->more_results()){
    $this->mysql->next_result();
    $this->mysql->use_result();
}
nhjlsmyf

nhjlsmyf9#

我用代码点火器。一台服务器正常。。。这个可能更老。。。无论如何使用

$this->db->reconnect();

修好了。

roqulrg3

roqulrg310#

我认为问题是你在函数中建立了一个新的连接,但最后没有关闭它。为什么不尝试传入现有连接并重新使用它呢?
另一种可能是,您正在从while循环获取过程中返回。你永远不会完成那次外拍。

ut6juiuv

ut6juiuv11#

创建两个连接,分别使用这两个连接

$mysqli = new mysqli("localhost", "Admin", "dilhdk", "SMS");

$conn = new mysqli("localhost", "Admin", "dilhdk", "SMS");
0lvr5msh

0lvr5msh12#

我正在使用odbc,这个补丁对我很有用:odbc->tab system dsn->双击配置我的数据源->详细信息->tab游标->取消选中[不缓存仅转发游标的结果]->单击确定

wlsrxk51

wlsrxk5113#

我经常遇到这个错误,而且总是在phpmyadmin或sqlworkbench(我正在用php连接mysqli)中调试存储过程的时候。
这个错误是由于调试涉及在代码中的策略点插入select语句来告诉我变量的状态等。在这些客户机环境中运行一个生成多个结果集的存储过程是可以的,但是从php调用时会产生“commands-out-of-sync”错误。解决方法总是注解掉或删除调试选择,这样过程只有一个结果集。

y0u0uwnf

y0u0uwnf14#

仅供参考,我在混合两者时遇到了问题 multi_query 以及 query 同样的代码:

$connection->multi_query($query);
...
$connection->query($otherQuery);

就我所读的内容而言,它有未使用的结果挂起,因此导致了上述错误。
我用一个循环解决了这个问题,循环消耗了 multi_query :

$connection->multi_query($query);
while ($connection->next_result()); // <--- solves the problem
...
$connection->query($otherQuery);

在我看来 multi_query 所以我对结果本身没有兴趣。

sd2nnvve

sd2nnvve15#

问题是mysql客户机c库,大多数mysql api都是基于这个库构建的。问题是c库不支持同时执行查询,因此所有在此基础上构建的API也不支持。即使使用非缓冲查询。这就是编写异步mysql api的原因之一。它使用tcp直接与mysql服务器通信,wire协议支持同时查询。
您的解决方案是要么修改算法,这样就不需要同时进行这两个过程,要么将它们更改为使用缓冲查询,这可能是它们在c库中存在的原始原因之一(另一个原因是提供一种游标)。

相关问题