关于获得多节经文的php-mysql问题

时间:2010-12-06 22:53:48

标签: php mysql

答案:我正在读所有并决定,谢谢你,哈哈哈:D我< 3 stackoverflow

我为这个问题的模糊性和缺乏研究而道歉,但我真的不知道如何谷歌这个问题。

我正在将一本圣经经文和圣经章节传递到一个页面中,并将其从圣经db中拉出来喜欢这个

书=创世纪&安培; CHAPTER_NUMBER = 1&安培; verse_number = 1

但我想要做的是发送多个以“ - ”

分隔的经文 像这样:

书=创世纪&安培; CHAPTER_NUMBER = 1&安培; verse_number = 1-2

我真的不知道这是怎么回事。有任何想法吗?

3 个答案:

答案 0 :(得分: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";

[编辑] 做了一些小改动,删除了拼写错误并实际运行脚本来测试它。 :)

答案 1 :(得分: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];
    }
}

答案 2 :(得分:0)

我的更好(imho)版本的GolezTrol脚本。如果URL中未提供任何信息,则默认为Genesis,第1章,第1节。还在他的脚本中修复了一些语法错误/拼写错误。而且,他忘记了这本书。 ;)最后,删除多余的类型转换,并在必要时使用转义:

$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值已经是字符串。