الأوامر غير متزامنة؛لا يمكنك تشغيل هذا الأمر الآن

StackOverflow https://stackoverflow.com/questions/614671

  •  03-07-2019
  •  | 
  •  

سؤال

أحاول تنفيذ كود PHP الخاص بي، والذي يستدعي استعلامي MySQL عبر mysqli، ويحصل على الخطأ "الأوامر غير متزامنة؛لا يمكنك تشغيل هذا الأمر الآن".

هذا هو الرمز الذي أستخدمه

<?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;
        }
    }
}

لقد حاولت القراءة عن هذا، لكنني غير متأكد مما يجب فعله.لقد قرأت عن نتيجة المتجر والنتيجة المجانية، ولكن لم يحدث أي فرق عند استخدامها.لست متأكدًا بالضبط من النقطة التي حدث فيها هذا الخطأ، وأود أن أعرف سبب حدوثه وكيفية إصلاحه.

من خلال عبارات التصحيح الخاصة بي، لم يتم حتى إدخال حلقة if الأولى لـ countQuery، بسبب خطأ في بناء جملة sql الخاص بي بالقرب من '% ? %'.ولكن إذا اخترت فقط * بدلاً من محاولة التقييد بناءً على عبارة LIKE، ما زلت أحصل على خطأ في مزامنة الأمر.

هل كانت مفيدة؟

المحلول

وأنت لا يمكن أن يكون اثنين من الاستفسارات في وقت واحد لأن mysqli يستخدم الاستفسارات غير مصقول بشكل افتراضي (عبارات المعدة، بل على العكس لmysql_query الفانيليا). يمكنك إما جلب أول واحد في مجموعة وحلقة من خلال ذلك، أو نقول mysqli للتخفيف من الاستفسارات (باستخدام <لأ href = "http://php.net/manual/en/mysqli-stmt.store-result.php "يختلط =" noreferrer "> $stmt->store_result() ).

هنا لمزيد من التفاصيل.

نصائح أخرى

لقد قمت بحل هذه المشكلة في تطبيق C الخاص بي - وإليك كيفية القيام بذلك:

  1. نقلا عن منتديات mysql:

    ينتج هذا الخطأ عندما قم بإنهاء الاستعلام الخاص بك باستخدام محدد الفاصلة المنقوطة داخل التطبيق.على الرغم من أنه يلزم إنهاء استعلام باستخدام محدد الفاصلة المنقوطة عند تنفيذه من سطر الأوامر أو في متصفح الاستعلام، قم بإزالة المحدد من الاستعلام داخل التطبيق الخاص بك.

  2. بعد تشغيل استعلامي والتعامل مع النتائج [C API: mysql_store_result()]، أقوم بالتكرار على أي نتائج أخرى من المحتمل أن تكون معلقة والتي تحدث عبر تنفيذ عدة عبارات SQL مثل عبارتين محددتين أو أكثر (من الخلف إلى الخلف دون التعامل مع النتائج).

    الحقيقة هي أن إجراءاتي لا تُرجع نتائج متعددة ولكن قاعدة البيانات لا تعرف ذلك حتى أقوم بالتنفيذ:[واجهة برمجة التطبيقات C: mysql_next_result()].أفعل هذا في حلقة (لحسن التدبير) حتى ترجع قيمة غير الصفر.وذلك عندما يعلم معالج الاتصال الحالي أنه من المقبول تنفيذ استعلام آخر (أقوم بتخزين المعالجات الخاصة بي لتقليل حمل الاتصال).

    هذه هي الحلقة التي أستخدمها:

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

لا أعرف PHP ولكني متأكد من أنها تحتوي على شيء مشابه.

وكان لي اليوم نفس المشكلة، ولكن فقط عند العمل مع إجراء مخزن. هذا جعل الاستعلام تتصرف مثل استعلام متعددة، لذلك تحتاج إلى "استهلاك" النتائج الأخرى المتاحة من قبل جعل استعلام آخر.

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

وأنا استدعاء هذه الدالة في كل مرة قبل استخدام $ mysqli-> الاستعلام يعمل مع الإجراءات المخزنة أيضا.

function clearStoredResults(){
    global $mysqli;

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

}

وأنا استخدم كود إغنيتر. ملقم واحد موافق ... هذا واحد ربما كبار السن ... على أي حال باستخدام

$this->db->reconnect();

وثابت ذلك.

والمشكلة هي مكتبة عميل C الخلية، التي يتم بناؤها معظم واجهات برمجة التطبيقات MySQL على. والمشكلة هي أن المكتبة C لا يدعم التنفيذ المتزامن للاستفسار، لذلك كل واجهات برمجة التطبيقات التي بنيت على رأس ذلك لا كما تفعل. حتى إذا كنت تستخدم الاستفسارات غير مصقول. هذا هو أحد الأسباب التي كانت مكتوبة على الخلية API غير متزامن. فإنه يتصل مباشرة مع خادم MySQL باستخدام TCP وبروتوكول سلك <م> لا دعم الاستفسارات في وقت واحد.

والحل الخاص بك هو إما تعديل خوارزمية بحيث لا تحتاج إلى أن يكون كل قيد التنفيذ في وقت واحد، أو تغييرها إلى استخدام الاستعلامات مخزنة، الذي هو على الارجح واحدة من الأسباب الأصلية لوجودهم في المكتبة C (ل الآخر هو لتوفير نوع من المؤشر).

ولحل هذه المشكلة لديك لتخزين البيانات نتيجة قبل استخدامه

$numRecords->execute();

$numRecords->store_result();

وهذا كل شيء

بالنسبة لأولئك الذين لم تساعدهم الإجابات السابقة ...هنا ما كانت مشكلتي!!!

كان ربط المعلمات "ديناميكيًا" لذا كان لدي متغير يضبط معلمات البيانات ليتم استخدامها bind_param.لذلك كان هذا المتغير خاطئًا ولكن بدلاً من ظهور خطأ مثل "بيانات معلمة خاطئة" فإنه يقول "خارج المزامنة bla bla bla" لذلك كنت في حيرة من أمري...

آمل أن يكون ساعد شخص ما!

وعندما استخدمته

stmt->execute();

ويجب إغلاقه لاستخدام استعلام آخر.

stmt->close();

وهذه المشكلة كانت تطارد لي لعدة ساعات. نأمل، فإنه سيتم إصلاح لك.

وأعتقد أن المشكلة هي أنك إجراء اتصال جديد في وظيفة، ومن ثم لا إغلاقه في نهاية المطاف. لماذا لا تحاول تمرير في اتصال الحاليين وإعادة استخدامه؟

والاحتمال الآخر هو أن كنت عودته من منتصف فترة حلقة جلب. يمكنك أبدا أن يكتمل جلب الخارجي.

وتحقق لمعرفة ما إذا كنت تكتب جميع المعلمات بشكل صحيح. فإنه يلقي نفس الخطأ إذا كان مقدار معايير محددة ومن ثم تمريرها إلى وظيفة مختلفة.

لا يرتبط هذا إلى السؤال الأصلي، ولكن كان لي نفس خطأ الرسالة وهذا الموضوع هو الضربة الأولى في جوجل واستغرق الأمر مني بعض الوقت لمعرفة ما هي المشكلة، لذلك قد تكون ذات فائدة ل الآخرين:

وأنا لا تستخدم mysqli، لا تزال تستخدم mysql_connect كان لي بعض querys بسيطة، ولكنها تسبب استعلام واحد فقط querys أخرى إلى فشل ضمن نفس اتصال.

وأنا استخدم ماي 5.7 و PHP 5.6 كان لي الجدول مع نوع البيانات "JSON". من الواضح، لم بلدي فب الإصدار لا تعترف قيمة الإرجاع من الخلية (PHP فقط لا يعرفون ما يجب القيام به مع JSON-تنسيق لالمدمج في الخلية وحدة كانت قديمة جدا (على الأقل على ما أظن))

والآن لقد غيرت JSON-الميدان من نوع إلى نص (كما في الوقت الحالي أنا لا تحتاج إلى الخلية الأصلي JSON-وظائف) وكل شيء يعمل بشكل جيد

إذا كنت تستخدم مجموعة النتائج Buffered أو Unbuffered لجلب البيانات، فيجب عليك أولاً مسح البيانات التي تم جلبها من الذاكرة. بمجرد جلب كافة البيانات.حيث لا يمكنك تنفيذ إجراء MYSQL آخر على نفس الاتصال حتى تقوم بمسح الذاكرة التي تم جلبها.قم بإضافة هذه الوظيفة أدناه في الطرف الأيمن من البرنامج النصي الخاص بك، لذلك سيتم ذلك حل المشكلة

$numRecords->close(); or $numRecords->free(); // This clears the referencing memory, and will be ready for the next MYSQL fetch

مرجع من وثائق PHP

وأنا واجهت هذا الخطأ باستخدام عقيدة DBAL QueryBuilder.

وأنا خلقت استعلام مع QueryBuilder يستخدم subselects العمود، التي أنشئت أيضا مع QueryBuilder. تم إنشاء subselects فقط عبر $queryBuilder->getSQL() ولم ينفذ. حدث خطأ على خلق subselect الثاني. من خلال تنفيذ مؤقتا كل subselect مع $queryBuilder->execute() قبل استخدام $queryBuilder->getSQL()، عملت كل شيء. يبدو الأمر كما لو يبقى $queryBuilder->connection الاتصال في حالة غير صالحة لإنشاء SQL الجديد قبل تنفيذ SQL إعداده حاليا، على الرغم من المثال QueryBuilder جديد على كل subselect.

وكان لي حل لكتابة subselects دون QueryBuilder.

وكانت مشكلتي أنني كنت أول استخدام إعداد بيان وثم كنت تستخدم الاستعلام mysqli على نفس الصفحة والحصول على خطأ "أوامر متزامنة؛ لا يمكنك تشغيل هذا الأمر الآن". كان الخطأ بعد ذلك فقط عندما كنت تستخدم التعليمات البرمجية التي كان إعداد البيان.

ما فعلته كان لإغلاق هذا السؤال. وأنه يعمل.

وmysqli_stmt_close ($ stmt)؛

وبلدي كود

وget_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_get_category_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>

والأمر الذي عبرت مجرد رأيي، وأنا أيضا يستمد مرة أخرى متغير اتصال عبر اتصال $ العالمي ؛. لذلك أعتقد أن الأساس يجري بدأت مجموعة جديدة كاملة من نظام الاستعلام بعد انتهاء من إعداد البيان مع mysqli_stmt_close (stmt $)؛ وأيضا أنا مضيفا هذه الملفات وغيرها من الاشياء عن طريق تضمين

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top