Execução de SQL extenso

Enviada por Ronny Wdson 
Ronny Wdson
Execução de SQL extenso
20 de April de 2012 às 05:37PM
Bom dia a todos

Estou desenvolvendo um módulo onde o cliente recebe uma lista de instruções sql (da área de transferencia), cola em uma textarea de um form que quando é submetido envia para o arquivo php que executa essas instruções.
Segue abaixo os arquivos envolvidos no processo:
<formulario.php>
<html>
<head>
<title>Alterações e modificações do sistema </title>
</head>
<body>
<form name="comando_sql" action="manda.php" method="post">
SQL:</br>
<TEXTAREA NAME="comando" COLS=40 ROWS=15></TEXTAREA></br>
<input type="submit" value="Enviar">
</form>
</body>
</html>

-------------------------------------------------------------------------
<manda.php>
<?php
require_once('config.php'); //configurações da conexão

$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
if(!$link) {
die('Falha ao conectar ao servidor: ' . mysql_error());
}
$db = mysql_select_db(DB_DATABASE);
if(!$db) {
die("Não foi possível localizar Banco de Dados");
}

$sql_comando = $_POST['comando'];
if (mysql_query($sql_comando))
echo "Comando realizado com sucesso!!</br>";
else
echo "Problemas na execução do bloquo de instruções SQL";
?>


O problema é que quando eu coloco várias instuções juntas como TRUNCATE, UPDATE e INSERT o PHP retorna um erro.
Se eu fizer vários TRUNCATE o comando é realizado com sucesso... se eu fizer vários UPDATE também é realizado com sucesso e a historia também se repete para vários INSERT.
Mas quando eu coloco no meio dessas instruções alguns INSERT, UPDATE e TRUNCATE juntos (separados por linhas é claro), o php retorna erro.
Como resolver esse problema, levando em consideração que o usuário que vai operar esse módulo não possui habilidades para separar esses comandos por genero... ele vai simplesmente clicar com o botão direito do mouse, colar e depois clicar em enviar.
Segue abaixo a lista de instrução SQL que eu uso para testes:
--------------------------------------------------------------
update members set participa='X' where coluna='admin' or coluna='empresa1';
insert into cotacao (id, descricao, quantidade) values(0, 'COXIM DO MOTOR TRATOR MASSEY', 20),
(0, 'PRODUTOPRODUTOPRODUTO1', 1),
(0, 'PRODUTOPRODUTOPRODUTO2', 3),
(0, 'PRODUTOPRODUTOPRODUTO3', 5),
(0, 'PRODUTOPRODUTOPRODUTO4', 7),
(0, 'PRODUTOPRODUTOPRODUTO5', 9),
(0, 'PRODUTOPRODUTOPRODUTO6', 11),
(0, 'PRODUTOPRODUTOPRODUTO7', 13),
(0, 'PRODUTOPRODUTOPRODUTO8', 15),
(0, 'PRODUTOPRODUTOPRODUTO9', 17),
(0, 'PRODUTOPRODUTOPRODUTO10', 19),
(0, 'PRODUTOPRODUTOPRODUTO11', 21),
(0, 'PRODUTOPRODUTOPRODUTO12', 23),
(0, 'PRODUTOPRODUTOPRODUTO13', 25),
(0, 'PRODUTOPRODUTOPRODUTO14', 27),
(0, 'PRODUTOPRODUTOPRODUTO15', 29),
(0, 'PRODUTOPRODUTOPRODUTO16', 31),
(0, 'PRODUTOPRODUTOPRODUTO17', 33),
(0, 'PRODUTOPRODUTOPRODUTO18', 35),
(0, 'PRODUTOPRODUTOPRODUTO19', 37),
(0, 'PRODUTOPRODUTOPRODUTO20', 39),
(0, 'PRODUTOPRODUTOPRODUTO21', 41),
(0, 'PRODUTOPRODUTOPRODUTO22', 43),
(0, 'PRODUTOPRODUTOPRODUTO23', 45),
(0, 'PRODUTOPRODUTOPRODUTO24', 47),
(0, 'PRODUTOPRODUTOPRODUTO25', 49),
(0, 'PRODUTOPRODUTOPRODUTO26', 51),
(0, 'PRODUTOPRODUTOPRODUTO27', 53),
(0, 'PRODUTOPRODUTOPRODUTO28', 55),
(0, 'PRODUTOPRODUTOPRODUTO20', 57),
(0, 'PRODUTOPRODUTOPRODUTO21', 1);

Nesse caso se eu retirar a primeira linha (UPDATE´s) não retorna nenhum erro, ou se eu executar somente ela também não retorna erro....

Se alguém puder me ajudar, ficaria imensamente agradecido!
Marcos Regis
Re: Execução de SQL extenso
21 de April de 2012 às 07:40AM
quebre as instruções em varias usando o ';' como separador.

O PHP não suporta execução de multiplas instruções com mysql_query.

voce vai precisar quebrar e executar em loop

exemplo:
$instrucoes = explode(";",$_POST['comando']);
foreach($instrucoes as $instrucao){
mysql_query($instrucao);
}
Ronny Wdson
Re: Execução de SQL extenso
21 de April de 2012 às 10:00AM
Cara...

Batata... funcionou de primeira!
Muito obrigado pela força...
Parabéns pela forma clara e precisa que teve para resolver esse problema.
Ronny Wdson
Re: Execução de SQL extenso
02 de May de 2012 às 03:06PM
Marcos Regis

No dia que você respondeu o meu POST eu usei a sua recomendação e funcionou.
Mas agora quando eu tento realizar o mesmo processo o SQL não é executado.
Eu pedi para mostrar o resultado de cada linha dentro do foreach e ele mostra o seguinte:
---------------------------------------------------------------------
UPDATE `agropecu_cotacao`.`members` SET `participa` = \' \'
UPDATE `agropecu_cotacao`.`members` SET `participa` = \'X\' where coluna=\'admin\' or coluna=\'empresa1\'
INSERT INTO cotacao (`id`, `descricao`, `quantidade`) VALUES(0, \'COXIM DO MOTOR\', \'20.00\')
INSERT INTO cotacao (`id`, `descricao`, `quantidade`) VALUES(0, \'PRODUTO1\', \'1.00\')
INSERT INTO cotacao (`id`, `descricao`, `quantidade`) VALUES(0, \'PRODUTO2\', \'3.00\')
---------------------------------------------------------------------
Perceba que foi adicionado o o caracter "\" antes de cada aspa simples ou dupla.

O que será que está acontecendo?

Att
Ronny
Marcos Regis
Re: Execução de SQL extenso
02 de May de 2012 às 03:10PM
Isso é um escape. Faz parte do comportamento natural do PHP quando magic_quotes/magic_quotes_gpc está ativado

Se o erro é por conta disso use a função stripslashes() para remover as contra-barras.

http://php.net/stripslashes
Ronny Wdson
Re: Execução de SQL extenso
02 de May de 2012 às 03:34PM
Marcos

Mais uma vez obrigado.
Usei
mysql_query(stripslashes($instrucao)))
Em vez de somente
mysql_query($instrucao)
Agora deu certo.

Parabéns novamente!!
PAULO ROBERTO DE SOUZA
Re: Execução de SQL extenso
07 de May de 2012 às 01:22PM
Estou criando um banco de dados em mysql que alguns dados serão visualizados por paginas em php,preciso fazer uma busca e as informações que vou buscar do bd estão aparecendo entre delimitadores como # e não é comentario ou entre underlines ou outro caracter,como faço para exibir os dados contidos dentre estes delimitadores,por exemplo tenho uma coluna Historio as informações neste campo aparecem assim quando extraio um relatorio:

#05 de maio de 2012##Abertura de Serviço##Técnico:Paulo R.Bernardo##Descrição de toda atividade efetuada na OS#Horario Final#
como faço para chamar os dados e exibir sem o caracter #?
Marcos Regis
Re: Execução de SQL extenso
07 de May de 2012 às 06:12PM
Cara, abre outro tópico na parte de iniciantes.
Você precisa estar logado no PHPBrasil.com para poder enviar mensagens para os nossos fóruns.

Faça o login aqui.