0

I have a function called cargar combo:

function cargarcombo($VALOR,$DESCRIPCION,$TABLA, $CONDICION, $VALORACTUAL)
{
 $serverName = "IP\BD"; 
 $connectionInfo = array( "Database"=> 'Coop' );
 $conn = sqlsrv_connect( $serverName, $connectionInfo );
 if( $conn === false ) {
  die( print_r( sqlsrv_errors(), true));
 } 
 $sql = "SELECT $VALOR ,$DESCRIPCION FROM $TABLA $CONDICION";
 echo $sql;
 global $conn;
 $stmt = sqlsrv_query( $conn, $sql );
 if( $stmt === false) {
  die( print_r( sqlsrv_errors(), true) );
 }
 while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
       if ($VALORACTUAL == $row[$VALOR]){
         $select = ' Selected ';
        }
        else {
         $select = '';
        }
        echo "<option value=\"" . $row[$VALOR] .  "\" $select> " . $row[$DESCRIPCION] .  " </option>";

        echo "\n";
 }

 sqlsrv_free_stmt( $stmt);

}

called from my div :

 <div class="col-sm-10"> 
      <select class="form-control" name="producto" id="producto">
        <option value="">[Generico]</option>
         <?php  cargarcombo('ARTICULO', 'DESCRIPCION' , 'Cooperativa.dbo.articulos', ' order by DESCRIPCION asc ', $cbousuario); ?>
      </select>
    </div>

and throws this error:

sqlsrv_query() expects parameter 1 to be resource, null given in Array ( [0] => Array ( [0] => IMSSP [SQLSTATE] => IMSSP [1] => -14 [code] => -14 [2] => An invalid parameter was passed to sqlsrv_query. [message] => An invalid parameter was passed to sqlsrv_query. ) )

Anyone has an idea? because my conexion is OK, idk why it says is a null and not a resource?

1 Answers1

0

Tienes que hilar fino cuando trabajas con globales.

Error: no declarar la global al principio

Observa este ejemplo, que es lo que puede estar ocurriendo en tu contexto:

global $conn;
$conn=NULL;
connect();

function connect(){
    $conn="Conexión válida";
    global $conn;
    var_dump($conn);
}

Salida:

NULL

Explicación

¿Por qué la salida es NULL si a $conn se le asignó la cadena Conexión válida anteriormente? Por un motivo muy sencillo, antes de eso, fuera de la función, la variable $conn recibió el valor NULL y, al no declararla antes de la asignación dentro de la función, su valor sigue siendo NULL. Este es uno de los motivos por los que el uso de globales no es muy aconsejado1. Si la variable cambia en otra parte y no tienes declarada la global al principio del contexto donde la uses, prevalecerá el cambio anterior.


Correcto: declarar la global SIEMPRE al principio

Observa aquí:

global $conn;
$conn=NULL;
connect();

function connect(){
    global $conn;    
    $conn="Conexión válida";
    var_dump($conn);
}

Salida:

string(17) "Conexión válida"

Explicación

Wow ¿eso fue magia? No, simplemente se respetó la norma de declarar la global SIEMPRE al principio.

Pero el que funcione no justifica que escribas tu código así. La pregunta clave aquí es: ¿Necesitas realmente que $conn sea global? ¿Por qué? Si realmente lo necesitas, tienes que saber cómo usar la variable y tiene que haber un control estricto en el código para que no haya sorpresas. Con que modifique la variable en otra parte de código y no respetes ciertas normas te puedes llevar sorpresas desagradables.


Conclusión

Yo aconsejaría evitar el uso de globales y si las usas, respeta estas normas:

  • Declara la variable global siempre en la parte superior de cualquier código
  • Siempre en la parte superior de cualquier archivo
  • Siempre en la parte superior de cualquier función

Para más detalles del porqué, aparte de lo explicado aquí con ejemplos, puedes ver este comentario del Manual de PHP.


Notas:

  1. Para más detalles sobre esto puedes consultar la pregunta ¿Por qué es considerado una mala práctica utilizar variables globales? y las respuestas dadas.
A. Cedano
  • 86,578
  • 19
  • 122
  • 221
  • muy buen dato! muchas gracias! creo que me replanteare por que usar variables globales. – Lorena Acosta Jan 07 '20 at 15:32
  • De nada @LorenaAcosta. Por favor, traduce la pregunta al castellano. Me parece un caso muy interesante para aclarar el uso de globales. Saludos. – A. Cedano Jan 07 '20 at 15:35