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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top