كيف يمكنني الحصول على الصفوف السابقة والقادمة حتى ولو تم حذف بعض الصفوف؟

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

  •  22-07-2019
  •  | 
  •  

سؤال

ولدي وظائف PHP التالية التي تحدد الصفوف التالية والسابقة في قاعدة البيانات. ومع ذلك، هناك الكثير من المناسبات عندما الصفوف يمكن حذف وبالتالي سوف مهامي لا تعمل كما كل ما يفعلونه هو إنقاص مجال AUTO_INCREMENT.

وعلى سبيل المثال، الصف الحالي 5. بلدي وظيفة يعطي: 4 (السابق) و 6 (التالي). ماذا لو 6 و 7 يتم حذف. أفضل فكرتي هي للحفاظ على الاستعلام حتى أحصل على التوالي، ولكن هذا يبدو غير فعال، هل هناك طريقة أفضل؟

وشكر جميع

//function to get next tweet
function getNextTweet($key, $direction){

$sql = "SELECT tweet_id FROM tweets WHERE tweet_key = '$key' LIMIT 1";

$result = mysql_query($sql) or die("DB Error : ". mysql_error());

$result = mysql_fetch_assoc($result);

if($direction=='next'){

    $tweet_id = $result['tweet_id'] + 1;

}else{

    $tweet_id = $result['tweet_id'] - 1;

}

$sql = "SELECT * FROM tweets WHERE tweet_id = '$tweet_id' LIMIT 1";

$result = mysql_query($sql) or die("DB Error : ". mysql_error());   

return mysql_fetch_assoc($result);

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

المحلول

وعلى افتراض انك لا تملك سجلات bajillion ...

والسابق:

SELECT * 
FROM table 
WHERE (id < currentID) 
ORDER BY id DESC 
LIMIT 1

التالي

SELECT * 
FROM table 
WHERE (id > currentID) 
ORDER BY id ASC 
LIMIT 1

نصائح أخرى

إذا قمت بتشغيل النسخة الحديثة من الخلية، يمكنك تبسيط وظيفة الخاص بك

function getNextTweet($key, $direction)
{
    $cmp   = ($direction == 'next') ? '>' : '<';
    $order = ($direction == 'next') ? 'ASC' : 'DESC';

    $sql = "SELECT *
              FROM tweets
             WHERE tweet_id $cmp (SELECT tweet_id FROM tweets WHERE tweet_key = '$key' LIMIT 1)
          ORDER BY tweet_id $order
             LIMIT 1";

    $result = mysql_query($sql) or die("DB Error : ". mysql_error());       

    return mysql_fetch_assoc($result);
}

وطالما تتم فهرسة "tweet_id"، والاستعلام تكون سريعة جدا، حتى بالنسبة للملايين من السجلات.

وآخر شيء واحد، على تأكد من أن مفتاح $ يتم التحقق بشكل صحيح! وإلا، يمكن لأي شخص حقن SQL في الاستعلام الخاص بك، وهذا هو ثغرة أمنية ضخمة. إذا $key أي شيء ولكن مفتاح تجزئة، وينبغي أن <م> على الأقل تمر mysql_real_escape_string()

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