Сайт разработчика Александра Климова

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Выборка сообщений из базы данных

Когда мы настроили форму для отправки сообщений в базу данных, нужно как-то просматривать их. Администратор сайта может просмотреть их с помощью phpMyAdmin. Но простой сотрудник фирмы не сможет этого сделать. Для него нужно создать отдельную страницу, которая будет отображать нужные части сообщений. Таблица может иметь много столбцов, некоторые из них могут иметь служебную информацию.

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

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

Мы можем сделать запрос при помощи функции mysqli_query(). Напомню, что функция возвращает идентификатор. Далее мы должны передать идентификатор функции mysqli_fetch_array(), которая извлекает данные по одной записи за раз.

Каждая запись данных возвращается в виде массива, значение которого мы можем сохранять в переменной $row.


$row = mysqli_fetch_array($result);

Вы многократно вызываете функцию mysqli_fetch_array() для доступа к данным каждой записи результатов вашего запроса. Таким образом, если вызвать метод три раза подряд, то мы получим первые три записи таблицы, сохраняя значения колонок в виде элементов массива $row.


$row = mysqli_fetch_array($result);
$row = mysqli_fetch_array($result);
$row = mysqli_fetch_array($result);

В общем виде код будет следующим.


$query = "SELECT  *  FROM email_list"; 
$result = mysqli_query($db, $query); 

$row = mysqli_fetch_array($result);
echo $row['first_name'], ' '.$row['last_name'], ':'.$row['email'].'<br>';

$row = mysqli_fetch_array($result);
echo $row['first_name'], ' '.$row['last_name'], ':'.$row['email'].'<br>';

$row = mysqli_fetch_array($result);
echo $row['first_name'], ' '.$row['last_name'], ':'.$row['email'].'<br>';

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

Функция может извлекать одну запись таблицы и сохранять значения колонок в виде элементов массива $row, но функция сама не будет перемещаться по записям таблицы - она просто сохранит первую запись и на этом закончит обработку. Цикл while может вызывать функцию mysqli_fetch_array(), перемещаясь по каждой записи данных за раз, пока не достигнет последней.


while($row = mysqli_fetch_array($result)) {
    echo $row['first_name'], ' '.$row['last_name'], ':'.$row['email'].'<br>';
}

Теперь мы автоматизировали работу и код будет выполняться, пока в таблице есть записи, удовлетворяющие нашему условию. Стоит отметить, что функция не возвращает значения true/false, а возвращает идентификатор ресурса. Но PHP так устроен, что он либерально относится к данным и любые значения, отличные от нуля будет считать за true.

Если у вас есть база данных с электронными адресами, то рассылку организовать не составит труда.

Страница sendemail.html для отправки писем с формой для текста письма.


<html>
<head>
  <title>Send Email</title>
</head>
<body>

  <p>Write and send an email to mailing list members.</p>
  <form method="post" action="sendemail.php">
    <label for="subject">Subject of email:</label><br />
    <input id="subject" name="subject" type="text" size="30" /><br />
    <label for="body">Body of email:</label><br />
    <textarea id="body" name="body" rows="8" cols="40"></textarea><br />
    <input type="submit" name="Submit" value="Submit" />
  </form>
</body>
</html>

Форма запускает скрипт sendemail.php


<?php
  $from = 'you@mail.com';
  $subject = $_POST['subject'];
  $text = $_POST['body'];

  $db = mysqli_connect('data.server.com', 'admin', 'pass', 'database')
    or die('Error connecting to MySQL server.');

  $query = "SELECT * FROM email_list";
  $result = mysqli_query($db, $query)
    or die('Error querying database.');

  while ($row = mysqli_fetch_array($result)){
    $to = $row['email'];
    $first_name = $row['first_name'];
    $last_name = $row['last_name'];
    $msg = "Dear $first_name $last_name,\n$text";
    mail($to, $subject, $msg, 'From:' . $from);
    echo 'Email sent to: ' . $to . '<br />';
  } 

  mysqli_close($dbc);
?>
Реклама