كيفية تنفيذ استعلامين mysql كواحد في PHP/MYSQL؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

عندي استفسارين كالتالي:

SELECT SQL_CALC_FOUND_ROWS Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;
SELECT FOUND_ROWS();

أريد تنفيذ هذين الاستعلامين في محاولة واحدة.

$result = mysql_query($query);

ولكن بعد ذلك أخبرني كيف سأتعامل مع كل مجموعة من الجداول بشكل منفصل.في الواقع، في ASP.NET نستخدم مجموعة البيانات التي تتعامل مع استعلامين كـ

ds.Tables[0];
ds.Tables[1]; .. etc

كيف يمكنني أن أفعل الشيء نفسه باستخدام PHP/MYSQL؟

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

المحلول

تحديث: من الممكن على ما يبدو عن طريق تمرير العلم إلى mysql_connect().يرى تنفيذ استعلامات SQL متعددة في عبارة واحدة باستخدام PHP ومع ذلك، يجب على أي قارئ حالي تجنب استخدام mysql_-فئة الوظائف ويفضلون شركة تنمية نفط عمان.

لا يمكنك القيام بذلك باستخدام mysql-api العادي في PHP.فقط قم بتنفيذ استعلامين.والثاني سيكون سريعًا لدرجة أنه لن يهم.هذا مثال نموذجي للتحسين الجزئي.لا تقلق بشأن هذا

للسجل، يمكن القيام بذلك باستخدام mysqli و mysqli_multi_query-وظيفة.

نصائح أخرى

كما أجاب الآخرون، يمكن لواجهة برمجة التطبيقات mysqli تنفيذ استعلامات متعددة باستخدام وظيفة msyqli_multi_query().

على أية حال، تدعم شركة PDO الاستعلامات المتعددة بشكل افتراضي، ويمكنك التكرار على مجموعات النتائج المتعددة لاستعلاماتك المتعددة:

$stmt = $dbh->prepare("
    select sql_calc_found_rows * from foo limit 1 ; 
    select found_rows()");
$stmt->execute();
do {
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
} while ($stmt->nextRowset());

ومع ذلك، يعتبر الاستعلام المتعدد على نطاق واسع بمثابة فكرة سيئة لأسباب أمنية.إذا لم تكن حريصًا بشأن كيفية إنشاء سلاسل الاستعلام الخاصة بك، فيمكنك في الواقع الحصول على النوع الدقيق لثغرة حقن SQL الموضحة في الرسوم المتحركة الكلاسيكية "Little Bobby Tables" XKCD.عند استخدام واجهة برمجة التطبيقات التي تقيدك باستعلام واحد، لا يمكن أن يحدث ذلك.

وعن طريق SQL_CALC_FOUND_ROWS لا يمكنك.

<اقتباس فقرة>   

وعدد الصفوف متوفرة من خلال FOUND_ROWS () هو عابر وليس المقصود أن تكون متاحة في الماضي تصريح له عقب بيان SELECT SQL_CALC_FOUND_ROWS.

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

وربما كنت سأكون أفضل حالا القيام بذلك كما فرعي:

SELECT 
 (select count(*) from my_table WHERE Name LIKE '%prashant%') 
as total_rows,
Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;

وسيكون لديك لاستخدام ملحق MySQLi إذا كنت لا ترغب في تنفيذ استعلام مرتين:

if (mysqli_multi_query($link, $query))
{
    $result1 = mysqli_store_result($link);
    $result2 = null;

    if (mysqli_more_results($link))
    {
        mysqli_next_result($link);
        $result2 = mysqli_store_result($link);
    }

    // do something with both result sets.

    if ($result1)
        mysqli_free_result($result1);

    if ($result2)
        mysqli_free_result($result2);
}

ولديك لاستخدام MySQLi، رمز أدناه يعمل بشكل جيد

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query  = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";

/* execute multi query */
if ($mysqli->multi_query($query)) {
    do {
        /* store first result set */
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_row()) {
                printf("%s\n", $row[0]);
            }
            $result->free();
        }
        /* print divider */
        if ($mysqli->more_results()) {
            printf("-----------------\n");
        }
    } while ($mysqli->next_result());
}

/* close connection */
$mysqli->close();
?>

ومثل هذا:

$result1 = mysql_query($query1);
$result2 = mysql_query($query2);

// do something with the 2 result sets...

if ($result1)
    mysql_free_result($result1);

if ($result2)
    mysql_free_result($result2);

مكتوب على موقع PHP ذلك لا يسمح باستعلامات متعددة (يحرر:هذا صحيح فقط بالنسبة لامتداد mysql.يسمح Mysqli و PDO باستعلامات متعددة).لذلك لا يمكنك القيام بذلك في PHP، ولكن، لماذا لا يمكنك تنفيذ هذا الاستعلام في استدعاء mysql_query آخر، (مثل مثال جون)؟من المفترض أن يمنحك النتيجة الصحيحة إذا كنت تستخدم نفس الاتصال.أيضًا، mysql_num_rows قد يساعد أيضا.

نعم انها ممكن بدون استخدام ملحق MySQLi.

ببساطة استخدم CLIENT_MULTI_STATEMENTS في mysql_connectالحجة الخامسة.

الرجوع إلى التعليقات أدناه مشاركة حسني للمزيد من المعلومات.

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