php conexión con servidor – php azure

Pregunta:


Necesito conectar mi web a una base de datos alojada en un servidor de Microsoft Azure. El caso es que actualmente lo hago con mysqli orientado a procedimientos y Azure me genera el código de la conexión para PDO. Estoy tratando de usar los datos que me dan para adaptarlo a programación orientada a procedimientos. El código que ellos me generan:

// PHP Data Objects(PDO) Sample Code:
try {
    $conn = new PDO("sqlsrv:server = tcp:minombre.database.windows.net,1433; 
    Database = nombrebdd", "nombreusuario", "contrasena");
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
    print("Error connecting to SQL Server.");
    die(print_r($e));
}

// SQL Server Extension Sample Code:
$connectionInfo = array("UID" => "[email protected]bree", "pwd" => "
contrasena", "Database" => "nombredb", "LoginTimeout" => 30, 
"Encrypt" => 1, "TrustServerCertificate" => 0);

$serverName = "tcp:minombre.database.windows.net,1433";

$conn = sqlsrv_connect($serverName, $connectionInfo);

Y lo que estoy tratando de hacer, y sin mucho éxito por ahora, es:

$servername = "tcp:minombre.database.windows.net,1433";
  $username = "nombreusuario";
  $password = "contrasena";
  $dbname = "nombrebdd";

  // Create connection
  $conn = new mysqli($servername, $username, $password, $dbname);
  // Check connection
  if ($conn->connect_error) {
      die("Connection failed: " . $conn->connect_error);
  } 

  $sql = "SELECT id FROM productos";
  $result = $conn->query($sql);

  if ($result->num_rows > 0) {
      // output data of each row
      while($row = $result->fetch_assoc()) {
          echo "Usuario" . $row["id"];
      }
  } else {
      echo "0 results";
  }
  $conn->close();

Si alguien sabe decirme lo que estoy haciendo mal se lo agradecería 😀

Preguntado por: gmarsi

Respuesta A. Cedano:

Yo te recomendaría el uso de PDO, el cual ofrece más posibilidades que MySQLi.

Pero se requiere tener tu PDO bien configurado, para tales fines lo mejor es tener tu propia clase PDO.

Un ejemplo sencillo de clase PDO, con algunas funciones personalizadas:


Db.php

<?php
    class Db 
    {

    private $host      = 'localhost';
    private $user      = 'tu-usuario';
    private $dbname    = 'nombre-bd';
    private $pass      = 'password';
    private static $instance;

    public function __construct()
    {
        // DSN: cadena de conexión
        $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;

        /* Opciones
            * Muy importante, para tener una buena conexión PDO

        */    
        $options = array(
            PDO::ATTR_PERSISTENT    => true, //establecer a false si no se quieren conexiones persistentes
            PDO::ATTR_EMULATE_PREPARES => false, //no cambiar nunca
            PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION, //no cambiar nunca
            PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'" //juego de caracteres
        );

        // Crea nueva instancia de PDO
        try{
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
        }
        // Captura los errores
        catch(PDOException $e){
            $this->error = $e->getMessage();
        }
    }



    public static function getInstance()
    {
        if (self::$instance == null) 
        {
            $className = __CLASS__;
            self::$instance = new $className();
        }
        return self::$instance;
    }



     /******************************************** MÉTODOS IMPRESCINDIBLES */

    //Recibe las consultas
    public function query($query)
    {
        $this->stmt = $this->dbh->prepare($query);
    }

    //Ejecuta las consultas
    public function execute()
    {
        return $this->stmt->execute();
    }

    //Devuelve resultados de la consulta en PDO::FETCH_ASSOC 
    //Se puede cambiar o agregar otro método con otro tipo de resultado
    public function resultset()
    {
        $this->execute();
        return $this->stmt->fetchAll(PDO::FETCH_ASSOC);

    }

    //Envía los datos por separado para proteger de la inyección SQL
    public function bind($param, $value, $type = null)
    {
        if (is_null($type)) 
        {
            switch (true) 
            {
                case is_int($value):
                    $type = PDO::PARAM_INT;
                    break;
                case is_bool($value):
                    $type = PDO::PARAM_BOOL;
                    break;
                case is_null($value):
                    $type = PDO::PARAM_NULL;
                    break;
                default:
                    $type = PDO::PARAM_STR;
            }
        }
        $this->stmt->bindValue($param, $value, $type);
    }

    /********************************************** FIN MÉTODOS IMPRESCINDIBLES




    /******************************************** MÉTODOS OPCIONALES */

    //Devuelve el último registro insertado
    public function lastInsertId()
    {
        return $this->dbh->lastInsertId();
    }

    //Obtiene un registro simple
    public function single()
    {
        $this->execute();
        return $this->stmt->fetch(PDO::FETCH_ASSOC);
    }


    //Devuelve un solo valor, columna o 0
    public function valor()
    {
        $this->execute();
        $valor=$this->stmt->fetch(PDO::FETCH_COLUMN);
        return (empty($valor)) ? 0 : $valor;

    }

    //Verifica si un registro existe devolviendo true o false
    public function si_existe()
    {
        $this->execute();
        if ($this->stmt->fetch(PDO::FETCH_ASSOC))
        {
            return true;
        } 
        else 
        {
            return false;
        }
    }
     /**********************************************/

}

?>

Ejemplo de uso

En cualquier parte donde quieras usar la conexión:

  1. Incluir el archivo de conexión

    include_once("Db.php")

    Indicar la ruta correcta donde se encuentra

  2. Crear instancia de la clase y objeto conexión:

    $oDb = new Db();
    $oPDO=$oDb->getInstance();

  3. Consultar

    $oPDO->query("SELECT * FROM tabla WHERE col1=:col1 AND col2=:col2");
    $oPDO->bind(':col1', $col1);
    $oPDO->bind(':col2', $col2);
    $arrDatos = $oPDO->resultset();

    Las variables $col1 y $col2 serían datos obtenidos desde fuera que se pasarían a la BD separados de la instrucción SQL. No hay que preocuparse del tipo de dato, la clase se ocupa de ello (ver método bind de la misma).
    El método resultset() devuelve un array asociativo de nuestros datos, listo para ser recorrido y presentado en cualquier parte del programa.

Fuente

Tags:,

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *