Category: PHP

  • Google reCAPTCHA v2 en Laravel 12 con Livewire 3

    Google reCAPTCHA v2 en Laravel 12 con Livewire 3

    En este tutorial detallado, aprenderás a integrar Google reCAPTCHA v2 en tu aplicación Laravel 12 utilizando Livewire 3. Esta implementación ayudará a proteger tus formularios contra bots y spam, mejorando la seguridad de tu aplicación.

    (more…)
  • Instalar multiples versiones de PHP en diferentes carpetas

    Instalar multiples versiones de PHP en diferentes carpetas

    Para evitar conflictos primero desinstalar php

    sudo apt-get remove 'php*'
    sudo apt-get purge 'php*'

    Agregar el repositorio de ondrej/php

    sudo apt install software-properties-common -y
    sudo add-apt-repository ppa:ondrej/php -y
    sudo apt update && sudo apt upgrade -y

    Instalar el módulo fcgid de apache

    sudo apt install libapache2-mod-fcgid -y
    

    Instalar PHP 8.1 y 8.2

    (more…)
  • Solución: Warning: mysqli_real_connect(): The server requested authentication method unknown to the client [caching_sha2_password] in

    Solución: Warning: mysqli_real_connect(): The server requested authentication method unknown to the client [caching_sha2_password] in

    Warning: mysqli_real_connect(): The server requested authentication method unknown to the client [caching_sha2_password] in 
    Warning: mysqli_real_connect(): (HY000/2054): The server requested authentication method unknown to the client in

    Este error me apareció al tener Mysql 8 con PHP 7.2, la razón es que MySQL 8 por defecto usa caching_sha2_password, un complemento que no es reconocido por las versiones anteriores de PHP (mysqlnd).

    Solución 1: Actualizar PHP a una versión mas reciente.

    Solución 2: hacer un downgrade a mysql.

    Solución 3: Usar el métono de autenticación anterior explicado a continuación.

    sudo nano /etc/mysql/my.cnf

    Agregar al final

    [mysqld]
    default-authentication-plugin=mysql_native_password

    Y ejecutar la consulta:

    alter user 'username'@'localhost' identified with mysql_native_password by 'password';
  • No se puede instalar PHP en Debian

    No se puede instalar PHP en Debian

    Cuando se ejecuta sudo apt-get install php7.0 aparece el error:

    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    Some packages could not be installed. This may mean that you have
    requested an impossible situation or if you are using the unstable
    distribution that some required packages have not yet been created
    or been moved out of Incoming.
    The following information may help to resolve the situation:
    
    The following packages have unmet dependencies:
     php : Depends: php7.0 but it is not going to be installed
    E: Unable to correct problems, you have held broken packages.

    Se debe ejecutar el siguiente comando para verificar que PPAs tenemos configurados:

    LC_ALL=C apt policy

    Si la salida es esta:

     500 http://ppa.launchpad.net/ondrej/php/ubuntu disco/main amd64 Packages
         release v=19.04,o=LP-PPA-ondrej-php,a=disco,n=disco,l=***** The main PPA fo                                                                             r supported PHP versions with many PECL extensions *****,c=main,b=amd64
         origin ppa.launchpad.net

    Quiere decir que hemos roto el sistema agregando fuentes extranjeras, hay que eliminar las fuentes php del sourcelist:

    cd /etc/apt/sources.list.d/

    Eliminar las fuentes php:

    rm ondrej-ubuntu-php-disco.list
    rm ondrej-ubuntu-php-disco.list.save
    rm php7.3.list
    rm php7.3.list.save

    Actualizar e instalar

    apt-get update
    apt-get install php

    Y listo.

  • Instalar drivers de Microsoft PHP para SQL Server en Ubuntu 16.04

    Instalar drivers de Microsoft PHP para SQL Server en Ubuntu 16.04

    En este tutorial veremos cómo instalar PHP para SQL Server, en este ejemplo usaremos la versión 7.0, si se desea la versión 7.2 sólo es reemplazar, usaré Ubuntu 16.04 pero  puede funcionar con otras versiones.

    sudo su 
    add-apt-repository ppa:ondrej/php -y 
    apt-get update 
    apt-get install php7.0 php7.0-dev php7.0-xml -y --allow-unauthenticated
    

    Prerequisitos:

    sudo su 
    curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
    
    #Download appropriate package for the OS version
    #Choose only ONE of the following, corresponding to your OS version
    
    #Ubuntu 14.04
    curl https://packages.microsoft.com/config/ubuntu/14.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
    
    #Ubuntu 16.04
    curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
    
    #Ubuntu 17.10
    curl https://packages.microsoft.com/config/ubuntu/17.10/prod.list > /etc/apt/sources.list.d/mssql-release.list
    
    exit
    sudo apt-get update
    sudo ACCEPT_EULA=Y apt-get install msodbcsql17
    # optional: for bcp and sqlcmd
    sudo ACCEPT_EULA=Y apt-get install mssql-tools
    echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
    echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
    source ~/.bashrc
    # optional: for unixODBC development headers
    sudo apt-get install unixodbc-dev

    Drivers PHP para Microsoft SQL Server:

    sudo pecl install sqlsrv
    sudo pecl install pdo_sqlsrv
    sudo su
    echo extension=pdo_sqlsrv.so >> `php --ini | grep "Scan for additional .ini files" | sed -e "s|.*:\s*||"`/30-pdo_sqlsrv.ini
    echo extension=sqlsrv.so >> `php --ini | grep "Scan for additional .ini files" | sed -e "s|.*:\s*||"`/20-sqlsrv.ini
    exit

    Apache:

    sudo su
    apt-get install libapache2-mod-php7.0 apache2
    a2dismod mpm_event
    a2enmod mpm_prefork
    a2enmod php7.0
    echo "extension=pdo_sqlsrv.so" >> /etc/php/7.0/apache2/conf.d/30-pdo_sqlsrv.ini
    echo "extension=sqlsrv.so" >> /etc/php/7.0/apache2/conf.d/20-sqlsrv.ini
    exit

    Reiniciar apache

    sudo service apache2 restart

    Fuente:

    https://docs.microsoft.com/en-us/sql/connect/php/installation-tutorial-linux-mac?view=sql-server-2017#installing-the-drivers-on-ubuntu-1604-and-1710

    https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-2017

  • Enviar mensajes a través de la API de Telegram a un Canal

    A continuación como enviar mensajes a tráves de la API de Telegram a un canal:

    • El canal primero debe ser público, con el fin de saber el id del canal.
    • Tener un Telegram BOT.
    https://api.telegram.org/bot[BOT_API_KEY]/sendMessage?chat_id=[NOMBRE_DEL_CANAL_O_ID]&text=[MENSAJE]
    • BOT_API_KEY es la API Key generada por BotFather cuando se crea el bot
    • NOMBRE_DEL_CANAL_O_ID nombre o id del canal
    • MENSAJE el mensaje a enviar  (URL-encoded) es posible usar emojis sacandolos de acá https://apps.timwhitlock.info/emoji/tables/unicode

     

    $apiToken = "my_bot_api_token";
    
    $data = [
     'chat_id' => '@my_channel_name',
     'text' => 'Hello world!'
    ];
    
    $response = file_get_contents("https://api.telegram.org/bot$apiToken/sendMessage?" . http_build_query($data) );
  • Conectar Codeigniter con MSSQL en Ubuntu

    A continuación muestro como conectar codeigniter con mssql en ubuntu

    Para ubuntu 14 con php5

    apt-get install unixodbc freetds freetds-dev tdsodbc php5-odbc

    Para Ubuntu 16 con php7

    apt-get install unixodbc freetds-common freetds-dev tdsodbc php7.0-odbc

    Reiniciar Apache

    service apache2 restart

    Editar /etc/freetds/freetds.conf

    [nombre-servidor]
    host = 192.168.10.10
    port = 1433
    tds version = 7.3

    La version TDS 7.3 es para SQL Server 2008, para ver un listado de los protocolos visitar este link

     

    Editar /etc/odbcinst.ini 

    [TDS]
    Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
    Description = FreeTDS driver
    Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so

     

    Editar /etc/odbc.ini

    [mi-servidor]
    Driver = TDS
    Description = Descripcion 
    ServerName = nombre-servidor
    Database = bd_ejemplo

    El ServerName es el nombre del servidor en el archivo de configuración freetds.conf, en el archivo de configuración de codeigniter debe tener algo así:

    $db['mssql'] = array(
    'dsn' => '',
    'hostname' => 'dsn=my-server;uid=myusername;pwd=mypassword',
    'username' => '',
    'password' => '',
    'database' => 'MyDatabase',
    'database' => '',
    'dbdriver' => 'odbc',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
    );

    y se llama de esta forma:

    class Prueba_Model extends CI_Model{
    	public function __construct(){
    	parent::__construct();
    	$this->pruebadb = $this->load->database('mssql', true);
    }

     

  • setlocale no funciona – PHP

    setlocale no funciona – PHP

    La función setlocale() no funciona al setearlo con el idioma deseado en este caso el español.

    El primer paso es consultar si se encuentra instalado en el sistema, ingresando en la terminal el comando:

    locale -a

    (more…)

  • PHP Warning: file_put_contents(TelegramException.log): failed to open stream: Permission denied in …/vendor/longman/telegram-bot/src/Exception/TelegramException.php on line 24

    Luego de revisar la línea 24 del archivo al que hace referencia, se puede observar que trata de escribir y añadir un log.

    namespace Longman\TelegramBot\Exception;
    
    class TelegramException extends \Exception
    {
    
        public function __construct($message, $code = 0)
        {
            parent::__construct($message, $code);
    
            $path = 'TelegramException.log';
            $status = file_put_contents(
                $path,
                date('Y-m-d H:i:s', time()) .' '. self::__toString() . "\n",
                FILE_APPEND
            );
    
        }
    }
    

    Pero no tiene permisos de hacerlo. Por lo que hay que darselos a la carpeta en donde se encuentra el archivo php que se esta ejecutando

    chmod 777 [carpeta donde se esta ejecutando el script php]

     

  • Enviar por POST en ajax

    Enviar por POST en ajax

    Una forma de ver lo que se envía por POST a través ajax en PHP es probarlo en la misma página y mostrarlo con un alert, así verificamos que lo que se va es lo deseado.

    <?php
    
    if($_SERVER['REQUEST_METHOD'] == 'POST') {
        echo '<pre>';
        print_r($_POST);
        exit; // importante!
    }
    
    ?>
    
    <form method="post" id="classic_login" action="">
        <input type="text" name="user" placeholder="Username" class="classic_field" id="user_field" />
        <input type="text" name="pass" placeholder="Password"  class="classic_field" id="pass_field" />
        <input type="submit" name="login" value="Login" class="classic_button" id="login_button" />
        <input type="submit" name="register" value="Register" class="classic_button" id="register_button" />
    </form> 
    
    
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script type="text/javascript">
    $("#classic_login").submit(function(event) {
        var formdata  = $(this).serialize();
        event.preventDefault();
    
        $.ajax({
            url: document.URL, 
            type: 'POST',
            data: formdata,
            success: function(response) { 
                alert(response); 
            }
        });
    });
    </script>

    Si es un ARRAY lo que enviamos:

    "data": {sData:sData},

    En codeigniter en el controlador lo atrapamos de esta forma

    function test(){
    	$data = $this->input->post('sData');
    	print_r($data);
    }