2010-12-06 66 views
0

答案找到:我讀所有和決定,謝謝你洙多哈哈哈:DI < 3計算器PHP MySQL的問題

我對這個問題的模糊性和缺乏研究道歉,但我真的不知道如何谷歌這個問題。

我傳遞一個經文和聖經章節進入一個頁面,需要它,並從聖經分貝拉詩句喜歡這個

?書=創世紀& CHAPTER_NUMBER = 1 & verse_number = 1

但我希望能夠做的就是發送在由分開的多個詩句「 - 」

這樣的:

書=創世紀& CHAPTER_NUMBER = 1 0123?verse_number = 1-2

我真的不知道這是如何工作的。有任何想法嗎?

+1

它比這更進一步嗎?像`number = 1-2,5,8-10`? – 2010-12-06 22:56:03

回答

2

這工作。它可以讓你給出一系列的經文,如1,3,4-10。如果沒有特定的經文,它會返回整章。

// Get the book and chapter 
$book = isset($_GET['book'])?(string)$_GET['book']:''; 
$chapter = isset($_GET['chapter'])?(string)$_GET['chapter']:''; 

// Make sure you escape the string to prevent SQL injection 
$book = mysql_real_escape_string($book); 
$chapter = mysql_real_escape_string($chapter); 

// Get the verses as a string. 
$verses = isset($_GET['verses'])?trim($_GET['verses']):''; 

if ($verses ==='') { 
    // If no verses are given, TRUE will trick the database 
    // into returning all verses for the given book. 
    $verseWhere = 'TRUE'; 
} else { 
    // Split it on the commas 
    $verseRanges = explode(',', $verses); 
    $verseConditions = array(); 

    // Split each value on '-', if any 
    foreach($verseRanges as $verseRange) { 
     $verseRange = explode('-', $verseRange); 
     // Build a condition 
     if (count($verseRange) === 1) { 
      $verseConditions[] = "verse = ".(int)$verseRange[0]; 
     } else { 
      $verseConditions[] = "verse BETWEEN ".(int)$verseRange[0]." AND ".(int)$verseRange[1]; 
     } 
    } 

    // Implode the array to build a list of conditions 
    $verseWhere = "(".implode(' OR ', $verseConditions).")"; 
} 

// Create the SQL statement 
$query = " 
    SELECT 
     * 
    FROM 
     Bible 
    WHERE 
     book = '$book' AND 
     chapter = '$chapter' AND 
     $verseWhere"; 

[編輯] 做了一些細微的變化,去掉了錯字的和實際運行的腳本來測試它。 :)

+0

這是一個很好的例子! – 2010-12-06 23:14:36

0

發送請求作爲

?book=Genesis&verse_number[]=1&verse_number[]=2&verse_number[]=3=10 

服務器將收到此作爲

$_GET = array(
    'book' => 'Genesis', 
    'verse_number' => array(
      '1', 
      '2', 
      '3-10' 
    ) 
) 

$verses = array(); 
foreach($_GET['verse_number'] as $item) { 
    $item = explode('-', $item); 
    if(isset($item[1])) { 
     for($i=(int)$item[0];$i<=(int)$item[1];$i++) 
      $verses[] = $item[$i]; 
    } else { 
     $verses[] = $item[0]; 
    } 
} 
+0

這會看起來很醜陋,而且當你有很多的經文時(例如1-50),會非常麻煩 – babonk 2010-12-06 23:13:42

+0

結帳更新 – Ish 2010-12-06 23:20:35

0

我的更好(imho)版本的GolezTrol的腳本。如果URL中沒有提供任何信息,默認爲創世記第一章第一節。還修復了腳本中的一些語法錯誤/拼寫錯誤。另外,他忘了這本書。 ;)最後,除去過量的類型轉換,並用於轉義在必要時:

$book  = empty($_GET['book']) ? 'Genesis' : $_GET['book']; 
$chapter  = empty($_GET['chapter']) ? '1' : $_GET['chapter']; 
$verses  = empty($_GET['verses']) ? '1' : $_GET['verses']; 
$book  = mysql_real_escape_string($book); 
$chapter  = mysql_real_escape_string($chapter); 
$verseRanges = explode(',', $verses); 
$vC   = array(); 

foreach($verseRanges as $verseRange) { 
    $vR = explode('-', $verseRange); 
    foreach ($vR as &$value) { 
     $value = mysql_real_escape_string($value); 
    } 
    $vC[] = count($vR) === 1 
      ? 'verse = ' . $vR[0] 
      : 'verse BETWEEN ' . implode(' AND ', $vR); 
} 
$query = "SELECT * FROM Bible WHERE chapter = '" . $chapter . "' "; 
$query .= "AND book = '" . $book . "' "; 
$query .= 'AND (' . implode(' OR ', $vC) . ')'; 

代替逸出的使用類型強制使代碼的可讀性/理解的。始終爲將來的可讀性編碼。另外,$_GET值已經是字符串。