Пример использования хранимых процедур (php+mysql)

Рассмотрим пример использования хранимых процедур на примере связки php и mysql. Создадим базу данных  proekts с двумя таблицами sotr(ids,fio), sotr_in_proekt(idp,ids). Первая содержит данные по сотрудникам, вторая указывает, какой сотрудник в каком проекте участвует. Реализуем с помощью хранимых процедур каскадное удаление, а именно — при удалении сотрудника из таблицы sotr необходимо удалить все записи из таблицы sotr_in_proekt, соответствующие этому сотруднику. Реализуем также вывод сообщения о количестве удаленных записей из таблицы sotr_in_proekt. Необходимо также создать небольшой интерфейс на php для вызова хранимой процедуры.

Создадим хранимую процедуру del_sotr(ids), которая удаляет сотрудника из проекта, а также удаляет все записи из таблицы sotr_in_proekt, которые связаны с удаляемым сотрудником.

CREATE DEFINER=`root`@`localhost` PROCEDURE `del_sotr`(IN `ss` INT)
    NO SQL
begin
DECLARE cc int default 0;
delete from sotr where ids=ss;
select count(*) as cc from sotr_in_proekt where ids=ss;
delete from sotr_in_proekt where ids=ss;
end

В данной хранимой процедуре в переменной сс сохраняется количество удаляемых записей. Может есть и более грамотное решение. Готов выслушать.

Далее необходимо создать два файла.

Первый файл index.php

<?php
session_start();
$_db='proekts';
$_user='root'; 
$_pass=''; 
$db=mysql_connect('localhost',$_user, $_pass)OR DIE('Не могу создать соединение'); 
mysql_select_db($_db, $db)  or die(mysql_error()); 
$query='SELECT * FROM sotr'; 
$res=mysql_query($query, $db); 
?>
Сотрудники
<table border="1">
<tr><td>Код</td><td>ФИО</td></tr>
<?php
while ($row=mysql_fetch_array($res)) { 
echo"<tr><td>".$row['ids'].'</td><td><a href="del_sotr.php/?ids='.$row['ids'].'">'.$row['fio'].'</a></td></tr>'; }
$query='SELECT * FROM sotr_in_proekt'; 
$res=mysql_query($query, $db); 
?>
</table>
Сотрудники
<table border="1">
<tr><td>Код проекта</td><td>Код сотрудника</td></tr>
<?php
while ($row=mysql_fetch_array($res)) { 
echo"<tr><td>".$row['idp'].'</td><td>'.$row['ids'].'</td></tr>'; }
?>
</table>
<?php
if(isset($_SESSION['kolvo']))echo "Вы удалили ".$_SESSION['kolvo']." записей";
session_destroy();
?>

Второй файл del_sotr.php

<?
session_start();
$_db='proekts';
$_user='root';
$_pass='';
$db=mysql_connect('localhost',$_user, $_pass);
mysql_select_db($_db, $db);
if(!isset($_GET['ids'])) header("Location:index.php");
$query='call del_sotr('.$_GET['ids'].')';
$res=mysql_query($query, $db);
$row=mysql_fetch_array($res) ;
$_SESSION['kolvo']=$row['cc'];
header("Location: {$_SERVER["HTTP_REFERER"]}");
?>

sotrОкно работы программ показано слева.

Замечания.

1. Количество удаляемых записей у меня определяется переменной сс. В php имеется функция mysql_affected_rows() для подсчета удаленных записей. Чтобы увидеть ее работу можно вместо команды $_SESSION[‘kolvo’]=$row[‘cc’]; использовать следующую:

$_SESSION[‘kolvo’]=$row[‘cc’].» «.mysql_affected_rows();

2. При написании статьи использовал плагин Auto SyntaxHighlighter. Надеюсь, кавычки не изменились, можно сразу копировать.

Поделиться:
  • Добавить ВКонтакте заметку об этой странице
  • Мой Мир
  • Facebook
  • Twitter
  • LiveJournal
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • StumbleUpon
  • Technorati
  • БобрДобр
  • Memori.ru
  • МоёМесто.ru