0

estoy tratando de recoger los campos de un registro de MySQL, y para ello hago uso de lo siguiente:

$reg = mysql_query("SELECT * FROM draws WHERE urlID='$urlID'");

    while($data = mysql_fetch_array($reg)) {
        $title = $data ['title'];
    }

Todo se recoge de forma correcta, pero ahora necesito acceder a "$title" lo cual es una variable local, me imagino. ¿Como puedo hacerlo?

He probado definir anteriormente la función de esta mandera:

$title ='';

Para tratar de mantenerla global, y simplemente sobrescribir su valor, pero no funciona. ¿Alguien me puede ayudar?

Gracias.

Brahim Khallota
  • 958
  • 1
  • 15
  • 38

3 Answers3

3

En el ejemplo que expones $title pertenece al ámbito global, puedes imprimirla después del while tranquilamente

$reg = mysql_query("SELECT * FROM draws WHERE urlID='$urlID'");

    while($data = mysql_fetch_array($reg)) {
        $title = $data ['title'];
    }
// $title tendrá el valor de la ultima iteracion del while
echo $title;

Si a lo que te refieres es que el trozo de código está dentro de una función, puedes retornar el valor. Ejemplo:

function mi_funcion() {
    $reg = mysql_query("SELECT * FROM draws WHERE urlID='$urlID'");

        while($data = mysql_fetch_array($reg)) {
            $title = $data ['title'];
        }
    // retornamos el último valor de $title 
    return $title;
}
// asignamos el valor de retorno de la función a $titulo en el ámbito global
$titulo = mi_funcion();
echo $titulo;

Si lo que quieres es pasar una variable del ámbito global para ser usada dentro de una función puedes pasarla en los argumentos de dicha función. Ejemplo:

function mi_funcion($titulo) {
    // hacer lo que necesitemos con titulo
    echo $titulo;
}

$var = 'Esto es un titulo';
mi_funcion($var);

Puede ver una explicación del uso de las variables globales en ¿Cuál es el uso correcto de las funciones y variables globales? y de ámbito de las variables en ¿Cuál es el ámbito y el ciclo de vida «real» de una variable global en PHP?

Xerif
  • 7,283
  • 3
  • 17
  • 41
1

No entiendo qué sentido tiene tu código: recorrer todos los registros para quedarte sólo con el último.

Si esa es la intención lo mejor sería filtrar la consulta de forma que te traiga ese único registro que quieras.

El problema que se plantea sobre el ámbito de la variable que interesa se podría resolver con una función que te devuelva el resultado.

Por ejemplo, esta consulta te traería el último registro, suponiendo que tienes una columna id auto incremental.

function getTitulo($urlID){
    $title="";
    $sql="SELECT title FROM draws WHERE urlID='$urlID' ORDER BY id DESC LIMIT 1";
    $reg = mysql_query($sql);
    /*Dado que es un solo registro, no hace falta el while*/
    $data = mysql_fetch_array($reg);
    $title = $data ['title'];

    return $title;
}

Si por el contrario quieres todos los registros, entonces lo correcto sería declarar la variable fuera del while como un array, el cual irías llenando luego dentro del while:

function getTitulo($urlID){
    $arrTitles=array();
    $sql="SELECT title FROM draws WHERE urlID='$urlID'";
    $reg = mysql_query($sql);

    while($data = mysql_fetch_array($reg)) {
        $arrTitles = $data ['title'];
    }
    return $arrTitles;
}

Para usar ambas funciones desde cualquier parte sólo tendrías que preocuparte de que la función getTitle() esté en el ámbito en el que la quieras usar. Entonces la llamas, pasándole el parámetro y almacenas el valor que la función retorna o lo usas directamente.

$datosDeGetTitle=getTitle('elIdURL');

En $datosDeGetTitle tendrás lo que haya devuelto la función.


NOTAS:

  • Según sea el alcance y la organización de tu programa, esto se podría hacer también a través de clases, creando instancias de una clase la cual dispondría de métodos para devolver los diferentes elementos.
  • La consulta de tu código es vulnerable a ataques de Inyección SQL. Para blindar el código será necesario, si es posible para ti, pasar de la extensión mysql.* a mysqli o a PDO. La extensión que usas ahora ha sido declarada obsoleta y dejará de funcionar en PHP 7.
A. Cedano
  • 86,578
  • 19
  • 122
  • 221
0

con la supervariable "globals"

ejemplo:

<?php
function test() {
    $foo = "variable local";

    echo '$foo en el ámbito global: ' . $GLOBALS["foo"] . "\n";
    echo '$foo en el ámbito simple: ' . $foo . "\n";
}

$foo = "Contenido de ejemplo";
test();
?>

Si necesitas más info dejo enlace referenciado: http://php.net/manual/es/reserved.variables.globals.php

  • Gracias por responder. No lo he acabado de entender cómo aplicarlo a mi ejemplo: He hecho lo mismo pero quitando el "echo" y la cadena siguiente, es decir, dejar solo "$GLOBALS["title"]. (Necesito que su valor sea únicamente "$title = $data ['title'];". – Brahim Khallota May 20 '18 at 11:04