Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] script de búsqueda, no se como obtener los valores

Estas en el tema de script de búsqueda, no se como obtener los valores en el foro de PHP en Foros del Web. Tengo una base de datos de la biblia con las siguientes columnas libro, capitulo, verso y texto. Usando el formulario de búsqueda en HTML, el ...
  #1 (permalink)  
Antiguo 26/01/2017, 18:47
Avatar de blogger  
Fecha de Ingreso: diciembre-2005
Ubicación: frente al monitor
Mensajes: 398
Antigüedad: 18 años, 4 meses
Puntos: 12
Pregunta script de búsqueda, no se como obtener los valores

Tengo una base de datos de la biblia con las siguientes columnas libro, capitulo, verso y texto.

Usando el formulario de búsqueda en HTML, el usuario ingresa una busqueda compleja como:

Genesis 3:2, 8-7; Mateo 3:15-8; jueces 1

Donde el resultado sería

1) Texto del versiculo Genesis 3:2
2) Texto de los versiculos Genesis 3:8-7
3) Texto de los versiculos Mateo 3:15-8
4) El capitulo entero Jueces 1

¿Cómo puedo desarrollar una busqueda MySql para obtener esos resultados?

Quiero lograr lo que hacen el sitio de BibleGateway.

La tabla está estructurada de la siguiente manera:

Columnas Tipo
ID AutoInc
Libro TEXT
Versículo INT
Texto TEXT

Dividí la búsqueda en un array multiple, separandola por cada libro. Este es el resultado...

Código PHP:
//obtenemos la variable
$quest=filter_var(($_POST['search']), FILTER_SANITIZE_STRING);
//hacemos el explode
$quest explode(";",$quest);
//dividimos y salvamos en un array
$i 0
$size count($quest);
while (
$i $size) {
  
$claves[] = preg_split("/\W/"$quest[$i]);
  
$i++;

El resultado es:

Código PHP:
Array
(
    [
0] => Array
        (
            [
0] => Genesis
            
[1] => 3
            
[2] => 2
            
[3] => 
            [
4] => 5
            
[5] => 7
        
)
    [
1] => Array
        (
            [
0] => 
            [
1] => Mateo
            
[2] => 3
            
[3] => 5
            
[4] => 8
        
)
    [
2] => Array
        (
            [
0] => 
            [
1] => jueces
            
[2] => 1
        
)

Lo que hice fue esto, como prueba para ver si podía obtener todos los valores en su lugar y en cierta manera funciona, pero que pasa cuando la búsqueda es mayor de 6? Me pueden ayudar a simplificar? Cómo puedo hacerlo mejor?

Lo que hago en este ejemplo es ver si puedo obtener todas las variables en su lugar, para poder así posteriormente hacer la búsqueda en SQL.

Código PHP:
$i 0;
$size count($claves);
while (
$i $size) {
    
    
$count count($claves[$i]);
    
    if (
$count == 2) {
        
$lib $claves[$i][0];
        
$cap $claves[$i][1];
    }
    
    if (
$count == 3) {
        if (empty(
$claves[$i][0])) {
            
$lib $claves[$i][1];
            
$cap $claves[$i][2];
            
$ver $claves[$i][3];
        } else {
            
$lib $claves[$i][0];
            
$cap $claves[$i][1];
            
$ver $claves[$i][2];
        }
    }
    
    if (
$count == 4) {
        if (empty(
$claves[$i][0])) {
            
$lib $claves[$i][1];
            
$cap $claves[$i][2];
            
$ver $claves[$i][3];
        } else {
            
$lib $claves[$i][0];
            
$cap $claves[$i][1];
            
$ver $claves[$i][2];
        }
    }
    
    if (
$count == 5) {
        if (
is_numeric ($claves[$i][0])) {
            
$lib $claves[$i][0]." ".$claves[$i][1];
            
$cap $claves[$i][2];
            
$ver $claves[$i][3];
        } else {
            if (empty(
$claves[$i][0])) {
                
$lib $claves[$i][1];
                
$cap $claves[$i][2];
                
$ver $claves[$i][3];
                
$ver1 $claves[$i][4];
            } else {
                
$lib $claves[$i][0];
                
$cap $claves[$i][1];
                
$ver $claves[$i][2];
                
$ver1 $claves[$i][3];
            }
        }
    }
    
    if (
$count == 6) {
        if (
is_numeric ($claves[$i][0])) {
            
$lib $claves[$i][0]." ".$claves[$i][1];
            
$cap $claves[$i][2];
            
$ver $claves[$i][3];
            
$ver1 $claves[$i][5];
        } else {
            
$lib $claves[$i][0];
            
$cap $claves[$i][1];
            
$ver $claves[$i][2];
            
$ver1 $claves[$i][4];
            
$ver2 $claves[$i][5];
        }
    } 
Gracias por su ayuda.
__________________
http://exegesis-biblica.com/
  #2 (permalink)  
Antiguo 27/01/2017, 12:00
jhonnyalexander_91
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: script de búsqueda, no se como obtener los valores

Buenos días desde Colombia,

Analizando el problema podemos ver que hay un patrón para definir los campos dentro de la consulta, siempre y cuando se cumpla el patrón la consulta es válida. De tal manera, podemos echar mano de una expresión regular que extraiga los datos:

`Si está entre corchetes es opcional y los puntos suspensivos significan repetición`
Libro C [ : V [ - Vf ] [ , ... ] ]

Siendo:
- `Libro` el nombre del libro
- C el capítulo correspondiente
- V el verso que puede ser opcional
- Vf el verso final, que nos sirve para seleccionar un rango y es opcional
- Por último se puede seleccionar varios rangos o versos.

El patrón es muy poco variable y se puede hacer un análisis manual del texto (sin RegExp) pero sería complicar el código aunque este sería más eficiente. Yo, según el caso, diría que es mejor usar una expresión regular como la siguiente:

Código PHP:
<?php $pattern '/^(\w+)\s+(\d+)(?:\s*:\s*(\d+(?:\s*-\s*(?:\d+)|))(?:\s*,\s*(\d+(?:\s*-\s*(?:\d+)|)))*)?$/';
Esta habría que compararla contra cada una de las búsquedas y ya estaría preparada para hacer la captura

Prueba de concepto:
Código PHP:
<?php

$queries 
explode (';''Genesis 3:2, 8-7; Mateo 3:15-8; jueces 1');
$pattern '/^(\w+)\s+(\d+)(?:\s*:\s*(\d+(?:\s*-\s*(?:\d+)|))(?:\s*,\s*(\d+(?:\s*-\s*(?:\d+)|)))*)?$/';

foreach (
$queries as $subject) {
    
$matches = [];
    
preg_match ($patterntrim($subject), $matches);
    
var_dump ($matches);
}
  #3 (permalink)  
Antiguo 27/01/2017, 18:24
Avatar de blogger  
Fecha de Ingreso: diciembre-2005
Ubicación: frente al monitor
Mensajes: 398
Antigüedad: 18 años, 4 meses
Puntos: 12
Respuesta: script de búsqueda, no se como obtener los valores

Muy interesante tu código, y el resultado es similar. A excepción de que no trata correctamente el -

Lo use y este es el resultado:

Código PHP:
array(5) {
  [
0]=>
  
string(17"Genesis 3:2, 7-10"
  
[1]=>
  
string(7"Genesis"
  
[2]=>
  
string(1"3"
  
[3]=>
  
string(1"2"
  
[4]=>
  
string(4"7-10"
}
array(
4) {
  [
0]=>
  
string(12"Mateo 3:8-15"
  
[1]=>
  
string(5"Mateo"
  
[2]=>
  
string(1"3"
  
[3]=>
  
string(4"8-15"
}
array(
3) {
  [
0]=>
  
string(8"jueces 1"
  
[1]=>
  
string(6"jueces"
  
[2]=>
  
string(1"1"

Como ves no se divide el 8-15 o el 7-10, y con el mío si.

En verdad agradezco tu ayuda, pero el problema que tengo en si se encuentra en la segunda parte. Como verás en el mensaje 1, trato cada resultado por separado para hacer la consulta, la cuestión es que al hacer eso el código se extiende demasiado y las variables son infinitas.

Llegue a tratar 6 posibilidades, pero me detuve por que obviamente no estoy resolviendo el problema adecuadamente. Una consulta como: Génesis 3:1-20; 2:3; 15; Juan 3:16, Mateo 3:20; Jueces 2:2, 3:20; 5; 1 juan 1:19 el código de la segunda parte no la soporta, pero Biblegateway si... de hecho, tu código tampoco la soporta.

Espero me puedas ayudar
__________________
http://exegesis-biblica.com/
  #4 (permalink)  
Antiguo 28/01/2017, 01:35
Avatar de blogger  
Fecha de Ingreso: diciembre-2005
Ubicación: frente al monitor
Mensajes: 398
Antigüedad: 18 años, 4 meses
Puntos: 12
Respuesta: script de búsqueda, no se como obtener los valores

Encontre una manera simple de hacerlo:

Código PHP:
//obtenemos variable
$quest=filter_var(($_GET['search']), FILTER_SANITIZE_STRING);

// dividimos capitulos y versiculos
$partes preg_split('/\s*:\s*/'trim($quest" ;"));

// iniciamos el array libro
$libro = array('nombre' => ""'capitulo' => ""'versiculo' => array());

// $partes[0] = libro + capitulo, si isset $partes[1] es versiculo
if(isset($partes[0])) {

// 1.) capitulo
if(preg_match('/\d+\s*$/'$partes[0], $out)) {
$libro['capitulo'] = rtrim($out[0]);
}

// 2.) libro
$libro['nombre'] = trim(preg_replace('/\d+\s*$/'""$partes[0]));
}

// 3.) versiculo
if(isset($partes[1])) {
$libro['versiculo'] = preg_split('~\s*,\s*~'$partes[1]);

El resultado es (Genesis 3:1-20):

Código PHP:
Array
(
    [
nombre] => Genesis
    
[capitulo] => 3
    
[versiculos] => Array
        (
            [
0] => 1-20
        
)


Pero no funciona con la búsqueda compleja (Génesis 3:1-20; 2:3; 15; Juan 3:16, Mateo 3:20; Jueces 2:2, 3:20; 5; 1 juan 1:19), ¿Alguien me puede ayudar con eso?
__________________
http://exegesis-biblica.com/

Última edición por blogger; 28/01/2017 a las 01:42
  #5 (permalink)  
Antiguo 28/01/2017, 04:14
Avatar de blogger  
Fecha de Ingreso: diciembre-2005
Ubicación: frente al monitor
Mensajes: 398
Antigüedad: 18 años, 4 meses
Puntos: 12
Respuesta: script de búsqueda, no se como obtener los valores

Esta es una pregunta muy recurrente, y para aquellos que tengan el deseo o la intención de implementar un buscador bíblico en su sitio, les informo que encontré la solución.

Tengo varias biblias en SQL y

Código PHP:
//Variable del URL
$quest=filter_var(($_GET['search']), FILTER_SANITIZE_STRING);

//Dividimos las referencias
$quest preg_split('[,|;]'$quest);

print_r($quest);

// Iniciamos el blucle
foreach ($quest as $valor) {
    
    
// Separamos las referencias
    
$parts preg_split('/\s*:\s*/'trim($valor));

    
// Preparamos el Array
    
$book = array('name' => ""'chapter' => ""'verses' => array());

    
// $part[0] = libro + capitulo, si isset $part[1] es versiculo
    
if(isset($parts[0]))
    {
        
// 1.) Capitulo
        
if(preg_match('/\d+\s*$/'$parts[0], $out)) {
            
$book['chapter'] = rtrim($out[0]);
        }

        
// 2.) Nombre del Libro
        
$x trim(preg_replace('/\d+\s*$/'""$parts[0]));
        
        
//Cuando no haya nombre del libro, usar nombre anterior 
        
if (empty($x)) {
            
$x $t;
            
$book['name'] = $x;
        } else {
            
$book['name'] = $x;
            
$t $x;
        }
    }

    
// 3.) Versiculos
    
if(isset($parts[1])) {
        
$book['verses'] = preg_split('~\s*,|-\s*~'$parts[1]);
    }
    
    
//Hacemos la consulta SQL
           
... 
El resultado es (Génesis 3:1-20; 2:3; 15; Juan 3:16, Mateo 3:20; Jueces 2:2, 3:20; 5; 1 juan 1:19):
Código PHP:
Array
(
    [
name] => Genesis
    
[chapter] => 2
    
[verses] => Array
        (
            [
0] => 3
        
)

)
Array
(
    [
name] => Genesis
    
[chapter] => 15
    
[verses] => Array
        (
        )

)
Array
(
    [
name] => Juan
    
[chapter] => 3
    
[verses] => Array
        (
            [
0] => 16
        
)

)
Array
(
    [
name] => Mateo
    
[chapter] => 3
    
[verses] => Array
        (
            [
0] => 20
        
)

)
Array
(
    [
name] => Jueces
    
[chapter] => 2
    
[verses] => Array
        (
            [
0] => 2
        
)

)
Array
(
    [
name] => Jueces
    
[chapter] => 3
    
[verses] => Array
        (
            [
0] => 20
        
)

)
Array
(
    [
name] => Jueces
    
[chapter] => 5
    
[verses] => Array
        (
        )

)
Array
(
    [
name] => 1 juan
    
[chapter] => 1
    
[verses] => Array
        (
            [
0] => 19
        
)


__________________
http://exegesis-biblica.com/

Etiquetas: formulario, html, mysql+consulta, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:40.