Stored Procedures, MySQL e PHP
-
02-07-2019 - |
Pergunta
A questão é bastante aberto. Estou usando Stored Procs com MS SQLServer por algum tempo com o clássico ASP e ASP.net e amá-los, os lotes.
Eu tenho um pequeno projeto passatempo que eu estou trabalhando e por várias razões ter ido a rota LAMP. Quaisquer dicas / truques / armadilhas ou boa pontos de partida para entrar usando procedimentos armazenados com MySQL e PHP5? Minha versão de MySQL suporta procedimentos armazenados.
Solução
Esqueça mysqli
, é muito mais difícil de usar do que DOP e já deveria ter sido removido. É verdade que introduziu grandes melhorias ao longo mysql, mas para alcançar o mesmo efeito em mysqli por vezes, requer um enorme esforço ao longo DOP ou seja associativa fetchAll
.
Em vez disso, dê uma olhada DOP , especificamente instruções preparadas e procedimentos armazenados .
$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hello';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);
// call the stored procedure
$stmt->execute();
print "procedure returned $value\n";
Outras dicas
@michal kralik - infelizmente há um bug com a API C do MySQL que usa DOP o que significa que executar o código como acima com algumas versões do MySQL resulta em erro:
"Erro de sintaxe ou violação de acesso: 1414 OUT ou INOUT argumento $ parameter_number por US $ procedure_name rotina não é uma variável ou nova pseudo-variável".
Você pode ver o relatório de erro em bugs.mysql.com . Tem sido fixa para a versão 5.5.3+ & 6.0.8 +.
Para solucionar o problema, você precisa separar in & out parâmetros e variáveis ??uso de usuários para armazenar o resultado como este:
$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(:in_string, @out_string)");
$stmt->bindParam(':in_string', 'hello');
// call the stored procedure
$stmt->execute();
// fetch the output
$outputArray = $this->dbh->query("select @out_string")->fetch(PDO::FETCH_ASSOC);
print "procedure returned " . $outputArray['@out_string'] . "\n";
Não é realmente obrigatório o uso de mysqli ou DOP para chamar procedimentos armazenados no MySQL 5. Você pode chamá-los muito bem com as antigas funções mysql_options. A única coisa que você não pode fazer é retornar vários conjuntos de resultados.
Descobri que retornar vários conjuntos de resultados é um pouco erro de qualquer maneira propenso; ela não funciona em alguns casos, mas somente se o aplicativo lembra a consumi-los todos, caso contrário, a conexão é deixado em um estado quebrado.
Você vai precisar usar MySQLI (MySQL Melhorada) para chamar procedimentos armazenados. Veja como você chamaria um SP :
$mysqli = new MySQLI(user,pass,db);
$result = $mysqli->query("CALL sp_mysp()");
Ao usar SPs você vai precisar de perto primeiro conjunto de resultados ou você receberá um erro. Aqui está mais algumas informações:
http://blog.rvdavid.net/ utilizando-procedimentos armazenados-mysqli-em-php-5 / (Ligação quebrada)
Como alternativa, você pode usar instruções preparadas , que eu acho muito simples e direta:
$stmt = $mysqli->prepare("SELECT Phone FROM MyTable WHERE Name=?");
$stmt->bind_param("s", $myName);
$stmt->execute();
MySQLI Documentação: http://no.php.net/manual/ en / book.mysqli.php
Tenho vindo a utilizar ADODB, que é uma grande coisa para abstrair comandos reais para torná-lo portátil entre diferentes servidores SQL (ou seja MySQL para MSSQL). No entanto, os procedimentos armazenados não parecem ser apoiadas diretamente. O que isto significa, é que eu tenho executar uma consulta SQL como se fosse uma normal, mas a "chamada" do SP. Uma consulta de exemplo:
$query = "Call HeatMatchInsert('$mMatch', '$mOpponent', '$mDate', $mPlayers, $mRound, '$mMap', '$mServer', '$mPassword', '$mGame', $mSeason, $mMatchType)";
Isto não é responsável por dados retornados, que é importante. Eu estou supondo que isso seria feito através da criação de um @var, que você pode selecionar a si mesmo como o retorno @Variable.
Para ser abstrato que, embora fazendo um primeiro php procedimento armazenado aplicativo baseado na web era muito difícil de contornar (mssql está muito bem documentado, isso não é), é grande depois de seu feito - mudanças são muito fáceis de fazer, devido à a separação.