2010-12-06 60 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值已经是字符串。