答案:我正在读所有并决定,谢谢你,哈哈哈:D我< 3 stackoverflow
我为这个问题的模糊性和缺乏研究而道歉,但我真的不知道如何谷歌这个问题。
我正在将一本圣经经文和圣经章节传递到一个页面中,并将其从圣经db中拉出来喜欢这个
?书=创世纪&安培; CHAPTER_NUMBER = 1&安培; verse_number = 1
但我想要做的是发送多个以“ - ”
分隔的经文 像这样: ?书=创世纪&安培; CHAPTER_NUMBER = 1&安培; verse_number = 1-2
我真的不知道这是怎么回事。有任何想法吗?
答案 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
值已经是字符串。