Хранимые процедуры, MySQL и PHP - PullRequest
       8

Хранимые процедуры, MySQL и PHP

3 голосов
/ 23 сентября 2008

Вопрос довольно открытый. В течение некоторого времени я использовал Stored Procs с MS SQLServer с классическими ASP и ASP.net, и мне это нравится.

У меня есть небольшой хобби-проект, над которым я работаю, и по разным причинам прошел путь LAMP. Любые советы / хитрости / ловушки или хорошие отправные точки, чтобы начать использовать хранимые процедуры с MySQL и PHP5? Моя версия MySQL поддерживает хранимые процедуры.

Ответы [ 5 ]

6 голосов
/ 21 декабря 2010

@ michal kralik - к сожалению, есть ошибка с MySQL C API, которую использует PDO, что означает, что выполнение вашего кода, как указано выше, с некоторыми версиями MySQL приводит к ошибке:

"Синтаксическая ошибка или нарушение прав доступа: аргумент 1414 OUT или INOUT $ параметр_номер для подпрограммы $ имя_процесса не является переменной или новой псевдопеременной"

Вы можете увидеть отчет об ошибке на bugs.mysql.com . Это было исправлено для версии 5.5.3+ & 6.0.8 +.

Чтобы обойти эту проблему, вам нужно разделить входные и выходные параметры и использовать пользовательские переменные для сохранения результата следующим образом:

$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";
4 голосов
/ 23 сентября 2008

Забудьте о mysqli, его гораздо сложнее использовать, чем PDO, и его уже следовало удалить. Это правда, что он внес огромные улучшения по сравнению с MySQL, но для достижения того же эффекта в MySQL иногда требуются огромные усилия по сравнению с PDO, то есть ассоциативные fetchAll.

Вместо этого взгляните на PDO , в частности подготовленные заявления и хранимые процедуры .

$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";
2 голосов
/ 24 сентября 2008

На самом деле не обязательно использовать mysqli или PDO для вызова хранимых процедур в MySQL 5. Вы можете просто вызывать их со старыми функциями mysql_. Единственное, что вы не можете сделать, это вернуть несколько наборов результатов.

Я обнаружил, что возвращение нескольких наборов результатов в любом случае несколько подвержено ошибкам; в некоторых случаях он работает, но только если приложение не забывает использовать их все, в противном случае соединение остается в разорванном состоянии.

2 голосов
/ 23 сентября 2008

Вам потребуется использовать MySQLI (улучшенное расширение MySQL) для вызова хранимых процедур. Вот как бы вы назвали SP :

$mysqli = new MySQLI(user,pass,db);

$result = $mysqli->query("CALL sp_mysp()");

При использовании SP вам необходимо закрыть первый набор результатов, иначе вы получите сообщение об ошибке. Вот еще немного информации:

http://blog.rvdavid.net/using-stored-procedures-mysqli-in-php-5/ (неработающая ссылка)

Кроме того, вы можете использовать Подготовленные заявления , которые я нахожу очень простыми:

  $stmt = $mysqli->prepare("SELECT Phone FROM MyTable WHERE Name=?");

  $stmt->bind_param("s", $myName);

  $stmt->execute();

MySQLI Документация: http://no.php.net/manual/en/book.mysqli.php

0 голосов
/ 07 декабря 2008

Я использовал ADODB, который отлично подходит для абстрагирования реальных команд, чтобы сделать его переносимым между различными SQL-серверами (то есть с mysql на mssql). Однако хранимые процедуры не поддерживаются напрямую. Это означает, что я запустил SQL-запрос, как будто он нормальный, но для «вызова» SP. Пример запроса:

$query = "Call HeatMatchInsert('$mMatch', '$mOpponent', '$mDate', $mPlayers, $mRound,  '$mMap', '$mServer', '$mPassword', '$mGame', $mSeason, $mMatchType)";

Это не учитывает возвращаемые данные, что важно. Я предполагаю, что это можно сделать, установив @Var, который вы можете выбрать в качестве возвращаемого значения @Variable.

Чтобы быть абстрактным, хотя создание первого веб-приложения на основе хранимой процедуры php было очень трудным для работы (mssql очень хорошо задокументировано, это не так), но после того, как это сделано, это здорово - изменения очень легко сделать из-за Разделение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...