لماذا تعود هذه الحلقة 1 عند استخدام && بدلا من "و"؟
سؤال
لغز لي هذا ... في while($row = mysql_fetch_assoc($result) and $runningOK)
حلقة، إذا كان PHP &&
يستخدم المشغل بدلا من and
من ثم mysql_fetch_assoc
يفشل بشكل رهيب ويعود فقط الرقم 1
عند تشغيل.
لقد حاولت mysql_fetch_array()
وفي المكان وما زلت لدي 1
مشكلة. إنه عندما، وفقط عندما يستبدل &&
مع ال and
مثل الحالي while
بيان أن الصفوف الصحيحة يتم إرجاعها.
لقد وضعت تصحيح البيانات من قبل، في الداخل، وبعد تأمين هذا. أود أن أعرف ما إذا كان هذا هو Quirk PHP أو شيء لم أستطع حسابه.
// Query
$selectQuery = "SELECT * FROM jobs_cache LIMIT 20";
// Run the Selection Query.
$result = mysql_query($selectQuery)
or die('Query Failed: '.mysql_error());
// Loop through results.
$runningOK = TRUE;
$resubmitList = array();
while($row = mysql_fetch_assoc($result) and $runningOK)
{
// Resubmit The Job
try
{
$client->addTaskBackground($row['function_name'],$row['job_data']);
$resubmitList[] = (string)$row['job_cache_id'];
}
catch(Exception $e)
{
echo "Error adding task for job id: " . $row['job_cache_id'];
$runningOK = FALSE;
}
}
المحلول
من المقرر أن الأسبقية للمشغل. يرى الدليل للحصول على التفاصيل ... إليك الجزء المناسب.
// "&&" له مسبق أكبر من "و"
// نتيجة التعبير (TRUE && FALSE) تم تعيينه إلى $ G
// Acts مثل: ($ g = (صحيح && false))$ g = صحيح && false؛
// يتم تعيين صحيح ثابت إلى $ H ثم يتم تجاهل خطأ
// Acts مثل: (($ h = true) و false)$ h = صحيح وكاذبة؛
var_dump ($ g، $ h)؛
BOOL (خطأ)
BOOL (صحيح)
لذلك، مع THE &&، يتم تعيين نتيجة التعبير إلى True، والذي يقيم إلى 1. مع وتقييم نتيجة وظيفة MySQL - أكثر ما تريد، أعتقد.
بالمناسبة، يمكنك أيضا استخدام break
للقضاء على الحاجة إلى متغير US $. للقيام بذلك، إزالة and $runningOK
من while
الشرط والتغيير $runningOK = FALSE;
ل break;
وسوف ينهي الحلقة إذا تم تشغيل كتلة الصيد.
نصائح أخرى
جرب هذا:
while(($row = mysql_fetch_assoc($result)) and $runningOK)
قد يكون هناك مزيج، كما هو تقييم mysql_fetch_assoc($result) and $runningOK
إلى TRUE، الذي يقوم عليه بعد ذلك $row
, ، والتي في هذه الحالة هي نفسها 1
إذا قمت بإضافة الأقواس، فمن المحتمل أن تستخدمها أيضا &&
أو and
, ، كما ستحصل على فصل الخصيتين بشكل صحيح.
هذا هو التأثير الجانبي في وضع الجملة البديلة أنا متأكد.
عامل التعيين =
والاثنين المنطقيين &&
و AND
لديك الأسبقية المختلفة: &&
يتم تنفيذها من قبل =
, ، والتي بدورها يتم تنفيذها من قبل AND
لذلك في الأساس البيان:
$row = mysql_fetch_assoc($result) AND $runningOK
يساوي:
($row = mysql_fetch_assoc($result)) AND $runningOK
في حين أن البيان:
$row = mysql_fetch_assoc($result) && $runningOK
يساوي:
$row = (mysql_fetch_assoc($result) && $runningOK)
في الحالة الأخيرة، تقوم فقط بتسنط القيم 1 (إذا أعاد mysql_fetch_assoc قيمة) أو 0.
ذلك لأن المشغل حل الحساسة.
تحقق من هذا الجدول لفهم:
http://php.net/manual/ar/language.operators.precedence.php.
استخدم () بقدر ما تحتاجه عندما لا تعرف كيف تم حلها.