Архив за Июнь 2008

Удаление/редактирование строк таблицы БД

Когда я не знаю, что написать в своем блоге, я иду на форум. Вот уж где есть возможность выбрать тему для заметки! На любой вкус. Итак, внимание, вопрос:

Имеется таблица на сайте, в которой перечислены данные взятые из таблицы MySQL (типа id, название, описание, дата добавления и т.д…). Все работает прекрасно. Но когда я хочу что-то удалить или изменить в этой таблице приходится это делать через phpmyadmin. Как мне это сделать непосредственно на сайте, напрямую?

Имя   | Описание       | Дата доб. | Удалить | Редактировать
------------------------------------------------------------
Слон  | Большой, серый | 30-12-06  | Удл.    | Ред.

Вообще, такой скрипт - неотъемлемая часть любой CMS. Ведь вся информация, как правило, хранится в базе данных. И когда мы через админку добавляем, удаляем, редактируем новости или статьи - фактически, мы добавляем, удаляем, редактируем записи в таблице.

<?php

if ( !isset( $_GET["action"] ) ) $_GET["action"] = "showlist"
 
switch ( $_GET["action"] )
{
  case "showlist":    // Список всех записей в таблице БД
    show_list(); break;
  case "addform":     // Форма для добавления новой записи
    get_add_item_form(); break;
  case "add":         // Добавить новую запись в таблицу БД
    add_item(); break;
  case "editform":    // Форма для редактирования записи
    get_edit_item_form(); break;
  case "update":      // Обновить запись в таблице БД
    update_item(); break;
  case "delete":      // Удалить запись в таблице БД
    delete_item(); break;
  default:
    show_list();
}

// Функция выводит список всех записей в таблице БД
function show_list()
{
  $query = 'SELECT id, title, description FROM items WHERE 1';
  $res = mysql_query( $query );
  echo '<h2>Список</h2>';
  echo '<table border="1" cellpadding="2" cellspacing="0">';
  echo '<tr><th>ID</th><th>Наименование</th><th>Описание</th><th>Ред.</th><th>Удл.</th></tr>';
  while ( $item = mysql_fetch_array( $res ) )
  {
    echo '<tr>';
    echo '<td>'.$item['id'].'</td>';
    echo '<td>'.$item['title'].'</td>';
    echo '<td>'.$item['description'].'</td>';
    echo '<td><a href="'.$_SERVER['PHP_SELF'].'?action=editform&id='.$item['id'].'">Ред.</a></td>';
    echo '<td><a href="'.$_SERVER['PHP_SELF'].'?action=delete&id='.$item['id'].'">Удл.</a></td>';
    echo '</tr>';
  }
  echo '</table>';
  echo '<p><a href="'.$_SERVER['PHP_SELF'].'?action=addform">Добавить</a></p>'
}

// Функция формирует форму для добавления записи в таблице БД
function get_add_item_form()
{
  echo '<h2>Добавить</h2>'
  echo '<form name="addform" action="'.$_SERVER['PHP_SELF'].'?action=add" method="POST">';
  echo '<table>';
  echo '<tr>';
  echo '<td>Наименование</td>';
  echo '<td><input type="text" name="title" value="" /></td>';
  echo '</tr>';
  echo '<tr>';
  echo '<td>Описание</td>';
  echo '<td><textarea name="description"></textarea></td>';
  echo '</tr>';
  echo '<tr>';
  echo '<td><input type="submit" value="Сохранить"></td>';
  echo '<td><button type="button" onClick="history.back();">Отменить</button></td>';
  echo '</tr>';
  echo '</table>';
  echo '</form>';
}

// Функция добавляет новую запись в таблицу БД 
function add_item()
{
  $title = mysql_escape_string( $_POST['title'] );
  $description = mysql_escape_string( $_POST['description'] );
  $query = "INSERT INTO items (title, description) VALUES ('".$title."', '".$description."');";
  mysql_query ( $query );
  header( 'Location: '.$_SERVER['PHP_SELF'] );
  die();
}

// Функция формирует форму для редактирования записи в таблице БД
function get_edit_item_form()
{
  echo '<h2>Редактировать</h2>';
  $query = 'SELECT title, description FROM items WHERE id='.$_GET['id'];
  $res = mysql_query( $query );
  $item = mysql_fetch_array( $res );
  echo '<form name="editform" action="'.$_SERVER['PHP_SELF'].'?action=update&id='.$_GET['id'].'" method="POST">';
  echo '<table>';
  echo '<tr>';
  echo '<td>Наименование</td>';
  echo '<td><input type="text" name="title" value="'.$item['title'].'"></td>';
  echo '</tr>';
  echo '<tr>';
  echo '<td>Описание</td>';
  echo '<td><textarea name="description">'.$item['description'].'</textarea></td>';
  echo '</tr>';
  echo '<tr>';
  echo '<td><input type="submit" value="Сохранить"></td>';
  echo '<td><button type="button" onClick="history.back();">Отменить</button></td>';
  echo '</tr>';
  echo '</table>';
  echo '</form>';
}

// Функция обновляет запись в таблице БД 
function update_item()
{
  $title = mysql_escape_string( $_POST['title'] );
  $description = mysql_escape_string( $_POST['description'] );
  $query = "UPDATE items SET title='".$title."', description='".$description."'
            WHERE id="
.$_GET['id'];
  mysql_query ( $query );
  header( 'Location: '.$_SERVER['PHP_SELF'] );
  die();
}

// Функция удаляет запись в таблице БД
function delete_item()
{
  $query = "DELETE FROM items WHERE id=".$_GET['id'];
  mysql_query ( $query );
  header( 'Location: '.$_SERVER['PHP_SELF'] );
  die();
}
 
?>

Скрипт для резервного копирования БД MySQL

Как-то гуляя по просторам Интернета, на Ответы@Mail.Ru наткнулся на такой вопрос:
У меня проблема. Мне нужно перенести базы с одного сервака на другой. А на первом недоступна phpMyAdmin. Что делать?

Когда-то я уже встречал такой вопрос на форуме, и видел ответ. Вот его-то я и привожу здесь в неизменном виде:

<?php

$host = "localhost"// имя сервера   
$user = "root";       // имя пользователя
$password = "";       // пароль
$db_name = "sql";     // имя базы данных
$dump_dir = "./dump"; // директория, куда будем сохранять резервную копию БД

$link = mysql_connect($host, $user, $password) or die( "Сервер базы данных не доступен" );
$db = mysql_select_db($db_name) or die( "База данных не доступна" );
$tables = "SHOW TABLES";
$res = mysql_query($tables) or die( "Ошибка при выполнении запроса: ".mysql_error() );
while( $table = mysql_fetch_row($res) )
{
    $fp = fopen( $dump_dir."/".$table[0].".sql", "a" );
    if ( $fp )
    {
        $query = "TRUNCATE TABLE `".$table[0]."`;\n";
        fwrite ($fp, $query);
        $rows = 'SELECT * FROM `'.$table[0].'`';
        $r = mysql_query($rows) or die("Ошибка при выполнении запроса: ".mysql_error());
        while( $row = mysql_fetch_row($r) )
        {
            $query = "";
            foreach ( $row as $field )
            {
                if ( is_null($field) )
                    $field = "NULL";
                else
                    $field = "'".mysql_escape_string( $field )."'";
                if ( $query == "" )
                    $query = $field;
                else
                    $query = $query.', '.$field;
            }
            $query = "INSERT INTO `".$table[0]."` VALUES (".$query.");\n";
            fwrite ($fp, $query);
        }
        fclose ($fp);
    }
}
 
?>

Ссылки по теме:

Как узнать сколько раз скачали файл?

Допустим, у вас на сайте есть раздел Downloads, где посетитель может скачать скрипты, музыку, фотографии и т.п. Но как узнать, какие файлы пользуются успехом, а какие лежат мертвым грузом (и их можно безболезненно удалить, чтобы не занимали место)?

Как решить эту проблему? Выход - счетчик скачиваний. Вы наверняка уже их видели. Обычно этот счетчик устанавливается рядом со ссылкой на скачиваемый документ. Примерно, все выглядит так:

Ссылка – Скачали [57]

57 – это число, которое увеличивается на 1 при каждом скачивании файла.

Пусть информация о файлах для скачивания у нас хранится в таблице базы данных, которая имеет следующую структуру:

  • id - уникальный ID файла
  • title - название программы, например, “Текстовой редактор NotePad++
  • about - краткое описание программы, например, “Бесплатный редактор текстовых файлов (замена стандартного Блокнота) с поддержкой синтаксиса большого количества языков программирования, ориентирован для работы в операционной системе MS Windows
  • name - имя файла для скачивания, например, NotePadPP.zip
  • download - количество скачиваний

Вообще говоря, файлы можно просто хранить под именами 1.zip, 2.zip, 3.zip, где 1, 2, 3 - уникальные ID. Потому как в поле name особого смысла нет - это избыточная информация. Единственная польза от такого поля - это при скачивании отдавать файл с каким-нибудь осмысленным именем, т.е. NotePadPP.zip, а не 1.zip.

Все файлы для скачивания лежат в директории
DOCUMENT_ROOT/downloads
В этой же директории лежит файл index.php, который выводит список всех файлов, доступных для скачивания и файл download.php, который отдает файлы на скачивание.

Файл index.php

<?php
$query = "SELECT id, name, about, download FROM programs WHERE 1";
$res = mysql_query( $query );
echo '<table border="1">';
while( $row = mysql_fetch_array( $res ) ) {
  echo '<tr>';
  echo '<td>'.$row['name'].'</td>';
  echo '<td>'.$row['about'].'</td>';
  echo '<td><a href="/downloads/download.php?id='.$row['id'].'" target="_blank">Скачать</td>';
  echo '<td>Скачан '.$row['downloads'].' раз</td>';
  echo '</tr>';
}
echo '</table>';
?>

Файл download.php

<?php
if ( !isset( $_GET['id'] ) ) {
  // если не передан ID файла
  header ("HTTP/1.0 404 Not Found");
  die();
}
$id = (int)$_GET['id'];
if ( $id < 1 ) {
  header ("HTTP/1.0 404 Not Found");
  die();
}
// Узнаем имя файла для скачивания
$query = "SELECT name FROM programs WHERE id=".$id;
$res = mysql_query( $query );
if ( mysql_num_rows( $res ) == 0 ) {
  header ("HTTP/1.0 404 Not Found");
  die();
}
$filename = mysql_result( $res, 0, 0 );
// если файла нет
if (!file_exists($filename)) {
  header ("HTTP/1.0 404 Not Found");
  die();
}
// сообщаем размер файла
header( 'Content-Length: '.filesize($filename) );
// дата модификации файла для кеширования
header( 'Last-Modified: '.date("D, d M Y H:i:s T", filemtime($filename)) );
// сообщаем тип данных - zip-архив
header('Content-type: application/zip');
// файл будет получен с именем $filename
header('Content-Disposition: attachment; filename="'.$filename.'"');
// начинаем передачу содержимого файла
readfile($filename);
// Увеличиваем счетчик количества закачек
mysql_query( "UPDATE programs SET download=download+1 WHERE id=".$id );
?>