PHP: يمكنني فقط استخدام هذه الوظيفة مرة واحدة (باستخدامها في حلقة أثناء ذلك)

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

سؤال

حصلت على إجابة على سؤال كبير سنا وهو ما يعمل تقريبا.

لدي وظيفة،

function vraagOp($table,$where)
{
    static $rVraagOp;
    if(!$rVraagOp){
        $qVraagOp = "SELECT * FROM $table WHERE $where";
        $rVraagOp = mysql_query( $qVraagOp );
    }
    return mysql_fetch_assoc( $rVraagOp );
}

أنني أريد استخدام مثل هذا

while (vraagOp("testtable","testtype = test")) 
{
   echo "testing <br>";
}

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

ماذا علي أن أتغير من أجل جعلها تعمل عدة مرات وما زلت تعمل في الحلقة أثناء ذلك؟

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

المحلول

استخدام شيء مثل هذا:

function vraagOp($table,$where)
{
    static $rVraagOp = null;
    if(!isset($rVraagOp)){
        $qVraagOp = "SELECT * FROM $table WHERE $where";
        $rVraagOp = mysql_query( $qVraagOp );
    }
    $ret = mysql_fetch_assoc( $rVraagOp );
    if(!$ret) $rVraagOp = null;
    return $ret;
}

انها قبيحة، ولكن إذا كنت تريد مثل هذا ...

نصائح أخرى

الخطأ هو لأنك لا إعادة تعيين نتيجة MySQL. لأنه يتم تخزينه في متغير ثابت، تحاول الوظيفة الوصول إلى نفس المورد الناتج في كل مرة. أستطيع أن أرى أنك تحاول قطع خطوة من استفساراتك (الجمع بين الاستعراض واسترداد الخطوات في واحد)، لكنني لن أزعجها إذا كنت أنت: الفوائد لا تفوق التكاليف في فقدان المرونة. التمسك بطريقة مجربة وحقيقية:

$result = mysql_query("SELECT * FROM foo");
while ($row = mysql_fetch_assoc($result)) { ... }

// loop through it again:
mysql_data_seek($result, 0);  // rewinds the result
while ($row = mysql_fetch_assoc($result)) { ... }

أو حتى أفضل، نلقي نظرة على نفايات أساليب.

يمكنك استخدام شيء مثل هذا بدلا من ذلك، سيكون أكثر لطيفة:

function vraagOp($table,$where, &$resource)
{
    if(!isset($resource)){
        $qVraagOp = "SELECT * FROM $table WHERE $where";
        $rVraagOp = mysql_query( $resource );
    }
    $ret = mysql_fetch_assoc( $resource );
    if(!$ret) $resource = null;
    return $ret;
}

واستخدامها مثل هذا:

$r = null;
while (vraagOp("testtable","testtype = test", $r)) 
{
   echo "testing <br>";
}

لا يزال قبيحا، ولكن أفضل قليلا.

أفترض أنك تريد التكرار فوق القيم التي تتلقاها من قاعدة البيانات؟

يجب عليك تغيير حلقة الخاص بك إلى foreach وظيفة:

foreach (vraagOp("testtable","testtype = test") as $row) 
{
   // here you have full access on the rows the function returns
   print_r($row);
   echo "testing <br>";
}

من المفترض أن تجرب هذا:

function do_query($table, $where){
   // please do some escaping for your $table and $where if necessary
   $qVraagOp = "SELECT * FROM `$table` WHERE $where";
   $rVraagOp = mysql_query( $qVraagOp );
   return $rVraagOp;
}

function do_fetch($result){
   return mysql_fetch_assoc( $result );
}

$res = do_query('testtable', 'testtype = "test"');

while($row = do_fetch($res)){
   var_dump($row); // dump each row out
}

تخميني هو أن لديك خطأ في استفسارك في "TestType = اختبار" لأن الاختبار هو سلسلة (أو هو أن العمود؟) لذلك لم يتم استدعاء فقط مرة واحدة فقط للعثور على خطأ.

كما يذكر نيكنك، يكون لدى PDO الكثير من العرض. حيث PDOStatement تنفذ اجازة واجهة، يمكنك استخدامها مباشرة في foreach.

$query = $db->prepare("SELECT id, name, location FROM `events` WHERE `when`=?");
$query->execute(array(strtotime('-3 days UTC')));
foreach ($query as $event) {
   ...
}

يدعم PDO أيضا البيانات المعدة, ، والتي توفر الكفاءة والأمن الذي يفتقر إليه سائق MySQL القديم.

كما يقف، vraagOp يبدو أن تكون تصميما ضعيفا لطبقة الوصول إلى البيانات.

الجواب الذي قدمته لسؤالك الأخير (الذي لم تقبله ...) يحل هذه المشكلة.

يحافظ على تعيين من طاولة محددة / حيث البنود، ويستخدم المورد الصحيح لكل مكالمة.

function vraagOp($table, $where)
{
    // Holds our mysql resources in a map of "{$table}_{$where}" => resource
    static $results = array();

    $key = $table . '_' . $where;

    if (!isset($results[$key]))
    {
        // first call of this particular table/where
        $results[$key] = mysql_query("SELECT * FROM $table WHERE $where");
    }

    $row = mysql_fetch_assoc($results[$key]);

    if ($row === false)
        // remove this key so a subsequent call will start over with a new query
        unset($results[$key]);

    return $row;
}

// Usage

while ($row = vraagOp("table1", "where field > 7")) {
   print_r($row);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top