2010-12-06 6 views
0

RÉPONSE TROUVE: Je lis tout et décider, MERCI SOO ​​BEAUCOUP hahaha: DI < 3 stackoverflowquestion php-mysql à obtenir plusieurs versets

Je présente mes excuses pour l'imprécision de cette question et le manque de recherche, mais Je n'avais vraiment aucune idée de comment google cette question.

Je passe un verset de la Bible et le chapitre de la Bible dans une page qui prend et tire le verset de la db bible aime ce

? Livre = Genèse & chapter_number = 1 & verse_number = 1

Mais ce que je veux être en mesure de faire est d'envoyer dans plusieurs versets séparés par un « - »

comme ceci:

livre = Genèse & chapter_number = 1 0123?verse_number = 1-2

Je ne sais pas vraiment comment cela fonctionnerait. Des idées?

+1

Est-ce que ça va plus loin? Comme 'number = 1-2,5,8-10'? –

Répondre

2

Cela fonctionne. Il vous permet de donner une gamme de versets comme 1,3,4-10. Cela retournera tout le chapitre si aucun verset spécifique n'est donné.

// 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"; 

[modifier] a fait quelques changements mineurs, retiré de la faute de frappe et fait courir le script pour le tester. :)

+0

Ceci est un bon exemple! –

+0

Type-indice beaucoup? Sérieusement, PHP a une faible typage pour une raison. Ne le combat pas! – Stephen

+0

Si je n'utilise pas d'indication de type, il faudrait que j'échappe aux valeurs. Les ints sont toujours ints. Pas grand chose à y échapper. :) Peut-être que je pourrais perdre les (cordes) mais j'aime bien taper autant que possible, j'ai même utilisé l'opérateur ===. ;) – GolezTrol

0

Envoyer la demande comme

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

serveur recevra ce que

$_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

Cela aurait l'air laid, et énormément encombrant quand vous avez beaucoup de versets (par exemple 1-50) – babonk

+0

checkout la mise à jour – Ish

0

Mon mieux (imho) version du script de GolezTrol. Par défaut à la Genèse, chapitre 1, verset 1 si aucune information n'est fournie dans l'URL. Correction de quelques erreurs de syntaxe/fautes d'orthographe dans son script. En outre, il a oublié le livre. ;) Enfin, l'excès retiré clichage et utilisé échapper le cas échéant:

$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) . ')'; 

En utilisant la coulée de type au lieu de Escaping rend votre code moins lisible/compréhensible. Toujours coder pour la lisibilité dans le futur. En outre, les valeurs $_GET sont déjà des chaînes.

+0

J'ai utilisé l'échappement si nécessaire. Une indication de type excessive est une question de goût, et passer des chaînes au lieu d'entiers est moins efficace. Pas tellement mieux, hein. : p – GolezTrol

+0

S'appuyer sur un artefact ou un effet secondaire de * one * feature (type casting) afin d'éviter d'utiliser une fonctionnalité qui a été conçue pour la tâche (escape) est au mieux gimmicky, et l'erreur sujette au pire. Aidez-moi à comprendre * pourquoi * vous ne voulez pas utiliser l'échappement? – Stephen

+0

Voici un exemple de type mal tourné. Imaginez si le PO a appris à taper l'entrée de l'utilisateur de cast, et ensuite essayé de coder quelque chose avec des flottants: http://stackoverflow.com/q/3385685/262056 – Stephen

Questions connexes