Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 命令不同步;现在无法运行此命令_Php_Sql_Mysql_Mysqli - Fatal编程技术网

Php 命令不同步;现在无法运行此命令

Php 命令不同步;现在无法运行此命令,php,sql,mysql,mysqli,Php,Sql,Mysql,Mysqli,我试图执行我的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-&

我试图执行我的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子句进行限制,我仍然会导致命令不同步错误。

我认为问题在于您在函数中建立了一个新连接,但最后没有关闭它。为什么不尝试传入现有连接并重新使用它


另一种可能是,您正在退出while循环获取的中间阶段。您永远不会完成外部获取。

您不能同时进行两次查询,因为mysqli默认情况下对准备好的语句使用无缓冲查询;这与普通mysql\u查询相反。您可以将第一个查询提取到一个数组中并循环,也可以告诉mysqli使用缓存查询


有关详细信息,请参阅。

问题在于MySQL客户端C库,大多数MySQL API都是基于该库构建的。问题是C库不支持同时执行查询,因此在此基础上构建的所有API也不支持。即使您使用非缓冲查询。这就是为什么要编写异步MySQL API的原因之一。它使用TCP直接与MySQL服务器通信,wire协议支持同时查询


您的解决方案是要么修改算法,这样您就不需要同时进行这两个过程,要么将它们更改为使用缓冲查询,这可能是它们在C库中存在的最初原因之一,另一个原因是提供一种游标。

我在我的C应用程序中解决了这个问题-我是这样做的:

引用mysql论坛:

当您在应用程序中使用分号分隔符终止查询时,会出现此错误。从命令行或查询浏览器执行查询时,需要使用分号分隔符终止查询,但请从应用程序内部的查询中删除该分隔符

在运行查询并处理结果[C API:mysql_store_result]之后,我将迭代通过多个SQL语句执行(例如两个或多个select语句背靠背执行)而产生的任何其他可能挂起的结果,而不处理结果

事实上,我的过程不会返回多个结果,但在我执行[C API:mysql\U next\U result]之前,数据库不知道这一点。我在一个循环中这样做,直到它返回非零。当当前连接处理程序知道可以执行另一个查询时,我缓存处理程序以最小化连接开销

这是我使用的循环:

for(; mysql_next_result(mysql_handler) == 0;) 
  /* do nothing */;
我不懂PHP,但我相信它也有类似的功能。

我使用CodeIgniter。 一台服务器正常。。。这个可能更老了。。。 无论如何使用

$this->db->reconnect();

已修复。

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

$numRecords->execute();

$numRecords->store_result();

这就是我今天遇到的所有问题,但只有在使用存储过程时才会遇到。这使得查询的行为类似于多重查询,因此在进行另一个查询之前,您需要使用其他可用的结果

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

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

这与原始问题无关,但我收到了相同的错误消息,该线程是Google中的第一个成功线程,我花了一段时间才弄清楚问题所在,因此它可能对其他人有用:

我没有使用mysqli,仍然使用mysql\u connect 我有一些简单的查询,但一个查询导致同一连接中所有其他查询失败

我使用mysql 5.7和PHP5.6 我有一个数据类型为JSON的表。显然,我的php版本没有识别mysql的返回值。php只是不知道如何处理JSON格式,因为内置的mysql模块太旧了,至少我认为是这样


现在,我将JSON字段类型更改为Text,因为现在我不需要本机mysql JSON功能,一切正常

每次使用$mysqli->query之前,我都会调用此函数 也适用于存储过程

function clearStoredResults(){
    global $mysqli;

    do {
         if ($res = $mysqli->store_result()) {
           $res->free();
         }
        } while ($mysqli->more_results() && $mysqli->next_result());        

}
清除引用内存,并运行下一次MYSQL获取

如果使用缓冲或非缓冲结果集来获取数据,那么在获取所有数据后,首先必须从内存中清除获取的数据。因为你不能执行 在清除提取的内存之前,请在同一连接上执行另一个MYSQL过程

在脚本的右端添加下面的函数,这样可以解决问题


这就是我的问题所在


param绑定是动态的,所以我有一个变量来设置数据的参数,以便使用bind_param。所以这个变量是错误的,但它没有抛出一个错误,比如错误的参数数据,而是说不同步bla bla bla bla,所以我很困惑…

我使用DBAL QueryBuilder遇到了这个错误

我使用QueryBuilder创建了一个查询,该查询使用列子选择,也使用QueryBuilder创建。子选择仅通过$queryBuilder->getSQL创建,未执行。创建第二个子选择时出错。通过在使用$queryBuilder->getSQL之前使用$queryBuilder->execute临时执行每个子选择,一切正常。这就好像连接$queryBuilder->connection在执行当前准备的SQL之前仍然处于无效状态,无法创建新的SQL,尽管每个子选择上都有新的queryBuilder实例


我的解决方案是在不使用QueryBuilder的情况下编写子选择。

我的问题是,我使用的是第一个prepare语句,然后在同一页面上使用mysqli query,并使错误命令不同步;现在无法运行此命令。只有在我使用包含prepare语句的代码时,才会出现错误

我所做的就是结束这个问题。它成功了

mysqli_stmt_close$stmt

我的代码


使用prepare语句在此处获取_category.php

    <?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_stmt_close$stmt结尾之后,一套全新的查询系统正在启动;我还通过include添加了这些文件和其他内容

stmt->execute();
您可以关闭它以使用另一个查询

stmt->close();

这个问题困扰了我好几个小时。希望它能修复您的连接。

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

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

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

另一个原因:存储结果不能调用两次

例如,在下面的代码中,将打印错误5

<?php

$db = new mysqli("localhost", "something", "something", "something");

$stmt = $db->stmt_init();
if ($stmt->error) printf("Error 1 : %s\n", $stmt->error);

$stmt->prepare("select 1");
if ($stmt->error) printf("Error 2 : %s\n", $stmt->error);

$stmt->execute();
if ($stmt->error) printf("Error 3 : %s\n", $stmt->error);

$stmt->store_result();
if ($stmt->error) printf("Error 4 : %s\n", $stmt->error);

$stmt->store_result();
if ($stmt->error) printf("Error 5 : %s\n", $stmt->error);

这可能与原始示例代码无关,但可能与寻求此错误答案的人有关。

我正在使用ODBC,此修复程序适用于我:
ODBC->tab System DSN->双击以配置我的数据源->详细信息->tab游标->取消选中[不缓存仅转发游标的结果]->单击确定这是一个老问题,但在我的情况下,所有发布的答案都不起作用,我发现在我的情况下,我在存储过程中的一个表上进行了选择和更新,同一个表有一个update触发器,该触发器正在被触发,并将过程发送到一个无限循环中。一旦发现错误,错误就消失了。

我经常遇到这个错误,而且总是在运行存储过程时,我一直在phpmyadmin或SQL Workbench中调试,我使用php连接mysqli


错误的原因是调试涉及在代码的关键点插入SELECT语句,以告诉我变量的状态等。在这些客户机环境中运行生成多个结果集的存储过程是可以的,但从php调用时会产生命令不同步错误。解决方案始终是注释掉或删除调试选择,以便过程只有一个结果集。

仅供参考,我在同一代码中混合使用多个查询和查询时遇到了以下问题:

$connection->multi_query($query);
...
$connection->query($otherQuery);
就我所读的内容而言,它有未使用的未决结果,因此导致上述错误

我用一个循环解决了这个问题,循环消耗了multi_查询的所有结果:


在我的例子中,多重查询中的所有查询都是插入的,因此我对结果本身没有兴趣。

如果我制作$con global,这是一种不好的做法,但应该按照您的描述工作,我仍然有相同的错误。我不认为建立全局连接是不好的做法,我同意,mysqli有点大脑受损。不过,它在PDO mysql驱动程序中做了正确的事情;我想你的回答应该更清楚。我花了很长时间才找到这些信息——它不容易显示在哪里。谢谢我只是用$select\u stmt->close将我的查询分开;不是同时分开,而是分开procedural@flussence,您声明mysqli默认使用无缓冲查询。那么我们如何设置它呢?我知道这看起来很奇怪,但我在执行一个mysqli_query违反外键的查询时出现了这个错误…所以如果任何人发生这种情况,请仔细检查您的插入查询是否违反了任何外键,我不需要同时执行这两个查询,我很高兴countQuery在第二次查询之前完全完成,但我不确定如何停止countQuery
由于处于progress中,您没有从countQuery中检索任何数据,这就是为什么它仍然处于“进行中”的原因。检索所有行,或将其更改为选择COUNTARTICLE_NO并获取该行。然后,您的第二个查询将运行。当您说异步MySQL API时,您指的是哪个API?还有,我没有得到你的结论。这个问题可以在不需要API异步的情况下解决。老实说@Pacerier我也不太清楚我的意思!在MySQL连接的六年中发生了很多事情,所以我认为我所指的任何东西都可能被重命名和/或合并到其他一些新的驱动程序中。在PHP中,我刚刚添加了:whilemysqli_next_result$con;谢谢你的回答,解决了我的问题。我删除了分隔符,它就工作了。我没有免费获取或存储我的结果,但在完成一条查询语句后关闭游标并重新构建。@Josh,在旧版mysql扩展中如何做到这一点?删除查询末尾的分号修复了命令不同步的问题;使用Python MySQLdb时,您现在无法运行此命令。这如何解决此问题?@Norman,这并不能解决此问题。它只是通过丢弃整个连接并重新连接来避免它。从性能的角度来看,这一点毫无意义。这一点很重要:存储过程返回的结果集超过了SP中代码可能生成的任何结果集。你必须处理这个问题,否则就会出现这个错误:如果你不需要一些记录,那么你不应该一开始就选择它们。与其将它们释放出来,还不如根本不选择它们。如果情况并非如此,并且您获取了所有选中的记录,那么将不会出现此类错误,也不需要调用close或free。对于存储过程,有一种不太野蛮的方法,如答案中所述above@Kaz我在手册上没有看到任何推荐这种方法的东西;或者method.get_category.php在这里使用prepare语句admin\u get_category\u body.php在这里mysqli注意:由于受到限制,无法发布所有代码我刚刚想到了一些事情,我还通过global$connection;再次添加了连接变量;。所以我认为基本上,在prepare语句以mysqli_stmt_close$stmt结尾之后,一套全新的查询系统正在启动;我还通过include添加了这些文件和其他内容。没有必要关闭语句。正如@stalinbeltran在上面回答的那样,我们需要在准备另一条语句之前使用一条语句的结果。所以,$stmt1->execute$stmt2=$conn->准备。。。将给出此错误,但$stmt1->execute$result1=$stmt1->get\u结果$stmt2=$conn->准备。。。会很好的。兄弟,这对我很有帮助。谢谢。对于每一个这样或那样说的人,在结束第一次之前,我使用了mysqli_prepare两次。它起作用了。
$connection->multi_query($query);
...
$connection->query($otherQuery);
$connection->multi_query($query);
while ($connection->next_result()); // <--- solves the problem
...
$connection->query($otherQuery);