Ejecutando MySQL *.archivos de sql en PHP

Tengo dos *.sql archivos que uso a la hora de crear un nuevo sitio web de la base de datos. El primer archivo que se crea todas las tablas. El segundo archivo rellena algunos registros predeterminados. Me gustaría ejecutar estos archivos de PHP. Yo también uso el Zend_Framework, si eso va a ayudar a lograr esto.

Información Adicional

  1. No tengo acceso a la consola
  2. Estoy tratando de automatizar el sitio de generación de dentro de nuestra aplicación.

SOLUCIÓN

Utilizando shell_exec()

$command = 'mysql'
        . ' --host=' . $vals['db_host']
        . ' --user=' . $vals['db_user']
        . ' --password=' . $vals['db_pass']
        . ' --database=' . $vals['db_name']
        . ' --execute="SOURCE ' . $script_path
;
$output1 = shell_exec($command . '/site_db.sql"');
$output2 = shell_exec($command . '/site_structure.sql"');

…Nunca me dio un resultado útil, pero siguió algunas sugerencias en otro hilo y, finalmente, consiguió que todos los que trabajan. Me cambio a la --option=value formato de los comandos y utilizar --execute="SOURCE ..." en lugar de < para ejecutar el archivo.

También, nunca tuve una buena explicación de la diferencia entre shell_exec() y exec().

  • Usted no puede utilizar la consola? Es mucho más fácil….
  • actualizado mi post
  • funcionó muy bien para mí en linux. he probado en windows xampp, pero la duda se va a trabajar 🙂
  • La diferencia entre shell_exec() y exec() es que shell_exec devuelve todo el flujo de salida como una cadena. exec devuelve la última línea de la salida. a través de stackoverflow.com/a/7093892/557358
  • Aquí es una muy buena solución que he venido para arriba con stackoverflow.com/a/41404203/627473
InformationsquelleAutor Sonny | 2010-10-26

12 Kommentare

  1. 41

    Esta pregunta viene de vez en cuando. No hay una buena solución para la ejecución de una .secuencia de comandos sql directamente desde PHP. Hay casos extremos en que las declaraciones comunes en una .sql script no puede ser ejecutado como instrucciones SQL. Por ejemplo, el mysql herramienta de builtin comandos que no son reconocidos por el Servidor de MySQL, por ejemplo,CONNECT, TEE, STATUS, y DELIMITER.

    Así que le doy +1 a @Ignacio Vázquez-Abrams del respuesta. Se debería ejecutar el .secuencia de comandos sql en PHP mediante la invocación de la mysql herramienta, por ejemplo, con shell_exec().


    Tengo esta prueba de trabajo:

    $command = "mysql --user={$vals['db_user']} --password='{$vals['db_pass']}' "
     . "-h {$vals['db_host']} -D {$vals['db_name']} < {$script_path}";
    
    $output = shell_exec($command . '/shellexec.sql');

    Ver también mis respuestas a estas preguntas:

    • Estoy intentando el shell_exec() de la ruta, pero no estoy encontrando ejemplos especificar un archivo a ejecutar. Esto es lo que tengo hasta ahora: shell_exec('mysql' . ' -u ' . $vals['db_user'] . ' -p ' . $vals['db_pass'] . ' -D ' . $vals['db_name']);
    • Leer el archivo para ejecutar la consola de redirección: mysql ... < mysqldump.sql
    • Yo pensaba que iba a ofrecer algunas ideas que cualquiera que esté leyendo esto que no podía conseguir que el trabajo, Un problema que puede ocurrir con shell_exec es que mysql no está en la ruta de acceso. Esto es fácil de probar ejecutando el comando mysql en la consola de la máquina afectada. En este caso, MySQL sería necesario añadir a la ruta de acceso o un enfoque alternativo sería necesario.
    • buena idea. Ruta de cuestiones relacionadas con bastante básico, pero se me olvida cómo muchas personas todavía lucha con ellos.
    • Lo que Si necesito crear una base de datos así?
    • Usted puede poner CREATE DATABASE <database> y USE <database> declaraciones en la parte superior de la secuencia de comandos SQL archivo. O como alternativa, puede ejecutar una instrucción CREATE DATABASE de PHP en primer lugar, a continuación, ejecute la secuencia de comandos SQL como he mostrado anteriormente.

  2. 18
    $commands = file_get_contents($location);   
    $this->_connection->multi_query($commands);
    • Su solución funciona para mysqli. Estoy usando PDO. Su respuesta me impulsó a hacer una búsqueda y he encontrado esto: stackoverflow.com/questions/6346674/…
    • Estoy usando mysqli y no pueden obtener esta solución para que funcione. $comandos simplemente vuelve como una cadena vacía. Por $ubicación he intentado tanto, un pariente de la ruta de acceso local (el archivo de secuencia de comandos se encuentra en la misma carpeta que el archivo php) y un completo hipervínculo. Puedo obtener el mismo resultado en ambos sentidos.
    • Esto parece un error para ciertos tipos de consultas avanzadas, tales como la creación de un procedimiento y de la ejecución de la misma.
  3. 14

    Aquí es lo que yo uso:


    function run_sql_file($location){
        //load file
        $commands = file_get_contents($location);
    
        //delete comments
        $lines = explode("\n",$commands);
        $commands = '';
        foreach($lines as $line){
            $line = trim($line);
            if( $line && !startsWith($line,'--') ){
                $commands .= $line . "\n";
            }
        }
    
        //convert to array
        $commands = explode(";", $commands);
    
        //run commands
        $total = $success = 0;
        foreach($commands as $command){
            if(trim($command)){
                $success += (@mysql_query($command)==false ? 0 : 1);
                $total += 1;
            }
        }
    
        //return number of successful queries and total number of queries found
        return array(
            "success" => $success,
            "total" => $total
        );
    }
    
    
    //Here's a startsWith function
    function startsWith($haystack, $needle){
        $length = strlen($needle);
        return (substr($haystack, 0, $length) === $needle);
    }
    • Hay edge-los casos en que esto va a fallar, y no con un mensaje de error, pero que (potencialmente) un comportamiento inesperado. Por ejemplo, multi-línea de literales de cadena en las declaraciones SQL podría comenzar con la cadena de '--' o literales de cadena puede contener ; caracteres. Si vas a ir a esta ruta, usted realmente debe utilizar un completo analizador SQL.
  4. 12

    Usted necesita para crear un completo analizador SQL para esto. Le recomendamos usar el mysql herramienta de línea de comandos para este lugar, invocando externamente desde PHP.

  5. 6

    Sé que estoy bastante tarde a la fiesta, pero PHP Mini Admin ha sido un salvavidas en un par de ocasiones. Es básicamente una «lite» de PHPMyAdmin todos los contenidos en un archivo así que no hay necesidad de complicadas instalaciones, acaba de cargar e iniciar la sesión. Simple!

  6. 2

    No olvidarse de phpMyAdmin. Bastante sólido interfaz para interactuar con MySQL.

    No sé si se resuelve el problema, ya que no sé si se puede interactuar con él directamente desde el código, pero solo quería tirar por ahí.

    • Buena sugerencia también. El análisis de dumps de mySQL en PHP puro chupa, phpMyAdmin toma el dolor de ella (no es automatizable, aunque).
  7. 1

    He creado un script de migración con multi_query. Puede el proceso de mysqldump de salida y phpmyadmin las exportaciones sin mysql herramienta de línea de comandos. También hice un poco de lógica para procesar varios archivos de migración basado en la marca de tiempo almacenados en la base de datos como Rieles. Sé que necesita más el manejo de errores, pero en la actualidad hace el trabajo por mí.

    Check it out: https://github.com/kepes/php-migration

    Creo que si no proceso de entrada del usuario con sólo secuencias de comandos realizados por los desarrolladores o exportación de herramientas que usted puede utilizar de manera segura.

  8. 1

    Puede utilizar esta secuencia de comandos para ejecutar MySQL archivos de secuencia de comandos. Tendrás que ajustar el $nombre, $userName, $password, $nombre, $puerto y $nombre_archivo de curso.

    <?php
    
    function parseScript($script) {
    
      $result = array();
      $delimiter = ';';
      while(strlen($script) && preg_match('/((DELIMITER)[ ]+([^\n\r])|[' . $delimiter . ']|$)/is', $script, $matches, PREG_OFFSET_CAPTURE)) {
        if (count($matches) > 2) {
          $delimiter = $matches[3][0];
          $script = substr($script, $matches[3][1] + 1);
        } else {
          if (strlen($statement = trim(substr($script, 0, $matches[0][1])))) {
            $result[] = $statement;
          }
          $script = substr($script, $matches[0][1] + 1);
        }
      }
    
      return $result;
    
    }
    
    function executeScriptFile($fileName, $dbConnection) {
      $script = file_get_contents($scriptFleName);
      $statements = parseScript($script);
      foreach($statements as $statement) {
        mysqli_query($dbConnection, $statement);
      }
    }
    
    $hostName = '';
    $userName = '';
    $password = '';
    $dataBaseName = '';
    $port = '';
    $fileName = '';
    
    if ($connection = @mysqli_connect($hostName, $userName, $password, $dataBaseName, $port)) {
      executeScriptFile($fileName, $connection);
    } else {
      die('Can not connect to MySQL');
    }
    • Al escribir una respuesta a su propia pregunta, podría usted por favor enviar una explicación, así como de código. Sin una explicación todavía no sabemos por qué el problema se ha solucionado sin tener que estudiar un montón de inútiles código.
    • No fue mi propia pregunta. TC pidió «me gustaría ejecutar estos archivos de PHP». Me dio el guión de cómo hacerlo. Si no puede leer este pequeño fragmento de código (no hay mucho para estudiar, es demasiado pequeño y obvio), y si usted no necesita la solución – por qué no se puede simplemente saltar mi respuesta en vez de ser tan grosero? 🙂
    • No estoy tratando de ser grosero. Ver que la baja votación anterior (alguien lo puso ahí en caso de que usted piensa que soy yo)? Estoy tratando de decirte que porque que están recibiendo y sugiriendo lo que usted puede hacer para conseguir upvotes lugar. Sólo estoy tratando de ayudar. también fue editado editado 3 min atrás y ahora se ve mejor. Por desgracia para los recién llegados, los usuarios esperan de una fantástica respuesta (y cuestionar) así como el código de trabajo. Es un don. Una vez que usted será capaz de hacer buenas respuestas (y preguntas) y obtener upvotes.
    • Espero no ofender, no me refiero a. Como he dicho anteriormente estoy tratando de obtener un poco de reputación por ayudar a mejorar sus respuestas y preguntas.
  9. 0

    Una sugerencia:

    //connect to db.
    if (mysql_query("SOURCE myfile.sql")) {
    
      echo "Hello Sonny";
    
    } 
    • Si esto funciona (dependerá de los privilegios) es definitivamente la mejor manera de ir.
    • Voy a probar esta ruta y ver si puedo hacer que funcione!
    • No, SOURCE es un builtin de la base de la herramienta. No se puede ejecutar como una consulta SQL.
    • mysql_query() no admite varias consultas
    • Hay formas de hacerlo. pero, por favor, ser muy conscientes acerca de las consultas; si no se tiene cuidado, el son propensos a la inyección de sql. Lee: php.net/manual/en/function.mysql-query.php y dev-explorer.com/articles/multiple-mysql-queries
  10. 0

    Para ejecutar generación de tablas desde dentro de la aplicación, es posible que desee crear un archivo php que hace que cuando se ejecuta.

    $hostname  = "localhost";
    $database  = "databasename";
    $username  = "rootuser";
    $UserPassword  = "password";
    
    $myconnection = mysql_pconnect($hostname, $username , $UserPassword) or trigger_error(mysql_error(),E_USER_ERROR); 
    mysql_connect($hostname , $username , $UserPassword ) or die(mysql_error());
    mysql_select_db($database) or die(mysql_error());
    
    if ( !$myconnection ){ echo "Error connecting to database.\n";}
    
    
    $userstableDrop = " DROP TABLE IF EXISTS `users`";
    $userstableCreate = " CREATE TABLE IF NOT EXISTS `users` (
    `UserID` int(11) NOT NULL,
      `User_First_Name` varchar(50) DEFAULT NULL
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=15" ;
    
    $userstableInsert = "INSERT INTO `users` (`UserID`, `User_First_Name`) VALUES
    (1, 'Mathew'),
    (2, 'Joseph'),
    (3, 'James'),
    (4, 'Mary')";
    
    $userstableAlter1 = "ALTER TABLE `users` ADD PRIMARY KEY (`UserID`)";
    $userstableAlter2 = " ALTER TABLE `users` MODIFY `UserID` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=15";
    
    $createDb_sql = $userstableDrop;
    $insertSite = mysql_query($createDb_sql);
    
    $createDb_sql = $userstableCreate;
    $insertSite = mysql_query($createDb_sql);
    
    $createDb_sql = $userstableInsert;
    $insertSite = mysql_query($createDb_sql);
    
    $createDb_sql = $userstableAlter1;
    $insertSite = mysql_query($createDb_sql);
    
    $createDb_sql = $userstableAlter2;
    $insertSite = mysql_query($createDb_sql);
    
    echo "Succesful!";
    mysql_close($myconnection );
  11. 0

    Aquí está mi solución y el código a continuación se explica lo que se hace.
    El principio es leer el archivo línea por línea, crear una consulta y ejecutar cada uno de ellos. He visto muchas soluciones mediante el uso de la «file_get_contents», que no es una buena solución, ya que podría causar un búfer problema, como la lectura de todo el contenido del archivo a la variable de la cadena.
    Mi solución toma en cuenta también los factores Desencadenantes de la duda.
    No hay ninguna matriz de asignación, comentarios y líneas en blanco se eliminan.

    <?php
     /**
     * Get a connection from database
     * @param type $db_host database hostname
     * @param type $db_user database username
     * @param type $db_password database password
     * @param type $db_name database name
     * @return \PDO
     */
     function get_db_connection($db_host, $db_user, $db_password, $db_name)
    {
        $dns = "mysql:host=$db_host;dbname=$db_name";
        try
        {
            return new PDO($dns, $db_user, $db_password);
        } catch (PDOException $ex)
        {
            return null;
        }
    }
    
    /**
     * Runs SQL queries from file
     */
    
     function exec_sql_queries_from_file($script_file, $db_host, $db_user, $db_password, $db_name)
    {
        //to increase the default PHP execution time
        set_time_limit ( 60 ); //Max time = 60 seconds
    
        //Connect to database
        $connection = get_db_connection($db_host, $db_user, $db_password, $db_name);
    
        //If the connection is acquired
        if($connection != null){
    
            //Open sql file
            $f = fopen($script_file, 'r');
    
            //sql query
            $query = '';
    
            //Default delimiter for queries
            $delimiter = ';';
    
            //read line by line
            while (!feof($f))
            {           
                $line = str_replace(PHP_EOL, '', fgets($f)); //read a line and remove the end of line character
    
                /* if the current line contains the key word 'DELIMITER'. Ex: DELIMITER ;; or DELIMITER $$
                 * mostly used for TRIGGERS' queries
                 */
                if(strpos($line, 'DELIMITER') !== false)
                {
                    //change the delimiter and read the next line
                    $delimiter = str_replace('DELIMITER ', '', $line);
                    continue;
                }   
    
                //Consider the line as part of a query if it's not empty and it's not a comment line
                if (!empty($line) && !starts_with($line, '/*') && !starts_with($line, '--'))
                {
                    //the query hasn't reach its end: concatenate $line to $query if $line is not a delimiter
                    $query .= $line !== $delimiter ? $line : '';
    
                    //if the current line ends with $delimiter: end of current query
                    if (ends_with($line, $delimiter))
                    {                
                        //exec the query
                        $connection->exec($query) or die($connection->errorInfo());
                        //start new query
                        $query = '';
                    }
                }                    
            }
    
            fclose($f);
        }
    }
    
     /**
     * Starts with function
     */
    function starts_with($haystack, $needle)
    {
        return $haystack{0} === $needle{0} ? stripos($haystack, $needle) === 0 : false;
    }
    
    /**
     * Ends with function
     */
    function ends_with($haystack, $needle)
    {
        $pos = stripos($haystack, $needle);
        return $pos === FALSE ? FALSE : substr($haystack, $pos) === $needle;

    }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea