Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2012, 01:58   #1
max74max
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 22
Вопрос Почтовый скрипт

Здравствуйте! Пожалуйста помогите разобраться, почему в скрипте не работает это строка:

mysql_query ('update sum_users set point = "777" id = "'.$this->sum_user['id'].'"');

Если же эту строку вставить в конец скрипта, то всё работает т.е. перезаписывается параметр point в mysql. Но нужно что бы данный параметр перезаписывался после выполнения функции т.е. перед выводом отчета:

$this->buf .= 'Отправлено: '.$send_count.'<br>Всего ошибок: '.$error_count.'<br>';

а не просто обновлением страницы.

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

Вот сам скрипт:

PHP код:
define('MSG_COMPLETE'1);
define('MSG_LIST''1;Рассылка звершена;');

define('MAIL_CONTENT_TEXT'1);
define('MAIL_CONTENT_HTML'2);
define('MAIL_CONTENT_LIST''1;TEXT;2;HTML;');
define('MAIL_KIND_MANUAL'1);  //адреса вводятся вручную
define('MAIL_KIND_TXT'2); //список адресов из файла

*****Часть кода******

class 
TMails{
var 
$buf;
var 
$Password;
var 
$From;
var 
$Content;
var 
$MailKind;
var 
$EMailList;
var 
$Title;
var 
$MailText;

    function 
TMails(){
        
$this->buf '';
    }

    
//выводим сообщение
    
function ShowMsg($msg){
        
$this->buf .= '<div align=center><h4>'.$msg.'</h4></div>';
    }

    function 
ShowHeader(){
        
$this->buf = <<< HEAD
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
****Часть кода******
    }

    function ShowFooter(){
        
$this->buf .= '</BODY></HTML>';
    }

    function ShowMainForm(){
        
$FromList = GetListItems($this->From, ';', MAIL_SENDER);
        
$ContentList = GetListItems($this->Content, ';', MAIL_CONTENT_LIST);
        
$KindList = GetListItems($this->MailKind, ';', MAIL_KIND_LIST);

    
$this->buf .= <<< MAIL_PREVIEW
<form action="
{$_SERVER['PHP_SELF']}" method=POST>
<table cellspacing="1" cellpadding="0">
*****Часть кода******
</table>
</form>
MAIL_PREVIEW;
    }

    function SendTxt(){
        if (
$this->Password != MAIL_PASSWORD){
            
$this->buf .= 'Введен неверный пароль';
            return false;
        }
        if ((trim(
$this->Title) == '') || (trim($this->MailText) == '')){
            
$this->buf .= 'Не задан заголовок или тело письма';
            return false;
        }
    
        //заголовки
        
$from = GetListValue($this->From, ';', MAIL_SENDER_NAME).' <'.GetListValue($this->From, ';', MAIL_SENDER).'>';
        
$headers = '';
        if (
$this->Content == MAIL_CONTENT_TEXT){
            
$headers = "Content-Type: text/plain; charset=windows-1251\r\n";
        } else {
            
$headers = "MIME-Version: 1.0\r\n"."Content-Type: text/html; charset=windows-1251\r\n";
        }
        
$headers .= "From: ".$from."\r\n"."Reply-To: ".$from."\r\n"."X-Mailer: PHP\r\n";
        //текст
        if (
$this->Content == MAIL_CONTENT_HTML){
            
$this->MailText = '<html><head><title>'.htmlspecialchars($this->Title).'</title></head><body>'.
                
$this->MailText.'</body></html>';
        }
        
$send_count = $error_count = 0;
        
$f_mail = ($this->MailKind == MAIL_KIND_TXT) ? file(MAIL_FILE_LIST) : explode("\r\n", $this->EMailList);
        
$lines = count($f_mail);
        for(
$i = 0; $i < $lines$i++){
            
$email = trim($f_mail[$i]);
            if (
$email != ''){
                
$this->buf .= $email.'<br>';
                if (!@mail(
$email$this->Title$this->MailText$headers)){
                    
$this->buf .= ' - ошибка<br>';
                    
$error_count++;
                } else {
                    
$send_count++;
                    if ((MAIL_LOG == 1) && (
$f_stat = @fopen(MAIL_FILE_LOG, 'a+'))){
                        @fwrite(
$f_stat$email."\n");
                        @fclose(
$f_stat);            
                    }        
                }
            }
            //задержка перед отправкой
      usleep(WAIT_TIME * 1000000);
        }
 mysql_query ('update sum_users set point = "777" id = "'.
$this->sum_user['id'].'"');// ТУТ ФУНКЦИЯ НЕ РАБОТАЕТ!!!!!
        
$this->buf .= 'Отправлено: '.$send_count.'<br>Всего ошибок: '.$error_count.'<br>';
        return true;
    }

    function ProcessEvents(){
        
$is_send = isset($_POST['Submit']);
        
$this->Password = isset($_POST['Password']) ? $_POST['Password'] : '';
        
$this->From = isset($_POST['From']) ? $_POST['From'] : '';
        
$this->Content = isset($_POST['Content']) ? $_POST['Content'] : '';
        
$this->MailKind = isset($_POST['MailKind']) ? $_POST['MailKind'] : '';
        
$this->EMailList = isset($_POST['EMailList']) ? $_POST['EMailList'] : '';
        
$this->Title = isset($_POST['Title']) ? $_POST['Title'] : '';
        
$this->MailText = isset($_POST['MailText']) ? $_POST['MailText'] : '';

        
$this->ShowHeader();
        if (
$is_send){
            switch (
$this->MailKind){
                case MAIL_KIND_MANUAL:    
                case MAIL_KIND_TXT:    
                    if (!
$this->SendTxt()) $this->ShowMainForm();
                    break;
            }
        } else {
            
$this->ShowMainForm();
        }
        
$this->ShowFooter();
        return 
$this->buf;
    }
}

$m = new TMails();
echo 
$m->ProcessEvents();

//mysql_query ('update sum_users set point = "777" id = "'.
$this->sum_user['id'].'"'); //----Вот тут функция работает!---- 

Последний раз редактировалось max74max; 19.01.2012 в 03:09.
max74max вне форума Ответить с цитированием
Старый 19.01.2012, 02:38   #2
Gorychev
Участник клуба
 
Аватар для Gorychev
 
Регистрация: 08.03.2008
Сообщений: 1,537
По умолчанию

Запрос не верно составлен, не должен работать ни коим образом.
Также не ясно откуда появляется значение $this->sum_user['id']?
Так попробуйте
Код:
update sum_users set point = "777" WHERE id = "'.$this->sum_user['id'].'"'
Gorychev вне форума Ответить с цитированием
Старый 19.01.2012, 03:17   #3
max74max
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 22
По умолчанию

К сожалению параметр WHERE ситуацию не меняет, если

mysql_query ('update sum_users set point = "777" id = "'.$this->sum_user['id'].'"');

вставить в конец скрипта то будет все работать как с WHERE так и без него...
ГЛАВНЫЙ Вопрос в том куда вставить:

mysql_query ('update sum_users set point = "777" id = "'.$this->sum_user['id'].'"');

Если бы вместо 777 была бы переменная $send_count

P.S. sum_user['id'] и параметры подключения к БД передаются от другого скрипта!

Последний раз редактировалось max74max; 19.01.2012 в 03:25.
max74max вне форума Ответить с цитированием
Старый 19.01.2012, 03:32   #4
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

Вобще-то для стрингов в sql используются ординарные кавычки
mysql_query ("update sum_users set point = '777' id = '".intval($this->sum_user['id'])."' ");
Cronos20 вне форума Ответить с цитированием
Старый 19.01.2012, 03:55   #5
max74max
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Cronos20 Посмотреть сообщение
Вобще-то для стрингов в sql используются ординарные кавычки
mysql_query ("update sum_users set point = '777' id = '".intval($this->sum_user['id'])."' ");
Возможно, я в php не силен, НО такой пример перестал работать даже в конце скрипта.

Вопрос остается открытым.
max74max вне форума Ответить с цитированием
Старый 19.01.2012, 11:24   #6
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Перед запросом - выводим весь подготовленный запрос в браузер, проверяем, что запрос сформирован корректно:
PHP код:
echo "update sum_users set point = '777', id = '".intval($this->sum_user['id'])."' "
Выведенный запрос выполняем напрямую через консоль или phpMyAdmin (или что вы там используете для работы с MySQL) - смотрим возможные ошибки.

или:
К запросу добавляем
or die(mysql_error()), или echo mysql_error() после запроса - этот код сообщит нам об ошибках при выполнении запроса:
PHP код:
mysql_query ("update sum_users set point = '777', id = '".intval($this->sum_user['id'])."' ") or die(mysql_error());
// or
mysql_query ("update sum_users set point = '777', id = '".intval($this->sum_user['id'])."' ");
echo 
mysql_error(); 
Поиск ошибок и отладка

PS: $this->sum_user - не вижу такого атрибута в вашем классе TMails .
Значения в запросе UPDATE разделяются запятыми:
Цитата:
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
[ORDER BY ...]
[LIMIT rows]
Andkorol вне форума Ответить с цитированием
Старый 19.01.2012, 17:41   #7
max74max
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 22
По умолчанию

Спасибо!

PHP код:
mysql_query ("update sum_users set point = '777', id = '".intval($this->sum_user['id'])."' ");
echo 
mysql_error(); 
Работает! В БД mysql значение point перезаписывается, что и требовалось.

Но по непонятным причинам скрипт пытается перезаписать значение id в БД. Тоесть был id = 1, а после выполнения скрипта id стал равен 0

Ошибка следующая: Duplicate entry '0' for key 'PRIMARY'

Цитата:
PS: $this->sum_user - не вижу такого атрибута в вашем классе TMails .
P.S. sum_user['id'] и параметры подключения к БД передаются от другого скрипта, ниже часть его кода.

PHP код:
class SUM {
    var 
$messages null;
    var 
$sum_user null;
    var 
$status null;
    var 
$db_res null;

    public function 
SUM($t 0) {
        if(
$t==0){
            
$this->action_database_connection();
            
$this->action_authorization();
        }
        else
            
$this->action_database_connection();
    }

    
// подключение к БД
    
function action_database_connection(){
        
        if(!
mysql_connect(SUM_Settings::$db['host'],SUM_Settings::$db['user_name'],SUM_Settings::$db['password'])){
         
            
$this->messages[] = 'Не удалось подключиться к серверу MySQL!';
            return 
false;

        }
        elseif(!(
$this->db_res mysql_select_db(SUM_Settings::$db['db_name']))){

            
$this->messages[] = 'Не удалось выбрать Базу Данных!';
            return 
false;

        }
        
mysql_query("set names utf8 collate utf8_general_ci");
        return 
true;
    } 
max74max вне форума Ответить с цитированием
Старый 19.01.2012, 17:44   #8
Gorychev
Участник клуба
 
Аватар для Gorychev
 
Регистрация: 08.03.2008
Сообщений: 1,537
По умолчанию

>> push <<
Gorychev вне форума Ответить с цитированием
Старый 19.01.2012, 17:54   #9
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,164
По умолчанию

update sum_users set point = '777', id = '".intval($this->sum_user['id'])."' ");

дает команду обновить поля point и id, так как intval($this->sum_user['id']) = 0
то именно это значение и пытается записать.. .на ваше счастье - поле id уникально и там уже есть запись с таким значением id
иначе бы у вас вся таблица sum_users состояли из значений 777 и 0 в соответствующих полях.

происходит - потому что вы не указали условие... условие задется через WHERE
в вашем случае
update sum_users set point = '777' WHERE id = '".intval($this->sum_user['id'])
ни у верное значение intval($this->sum_user['id']) должно быть чтобы для определенного элемента с определенным шв все обновлялось
ADSoft вне форума Ответить с цитированием
Старый 20.01.2012, 02:24   #10
max74max
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 22
По умолчанию

Что-то, я совсем звпутался...
итак:
Соединение с БД - есть

Такая функция работает, т.е. перезаписывает параметр 777 для id 2
PHP код:
mysql_query ("update sum_users set point = '777' WHERE id = '2' "); 
echo 
mysql_error(); 
А такая не работает, не выбирает id, но и ошибку не выдает
PHP код:
mysql_query ("update sum_users set point = '777' where id = '".intval($this->sum_user['id'])."' "); 
echo 
mysql_error(); 
Делал так, тоже самое... Ведь $id присваивается сама.
PHP код:
mysql_query ("update sum_users set point = '777' WHERE id = '$id' "); 
echo 
mysql_error(); 
Или я что-то не понимаю? Нужно что бы значение id выбиралось в зависимости от текушего пользователя. Как вызвать это значение id для текушего пользователя?
max74max вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почтовый клиент emsisem Помощь студентам 2 13.04.2011 20:31
Необходимо написать почтовый скрипт/программу romtitar Фриланс 2 15.02.2011 19:22
Почтовый уведомитель Alex Cones Софт 2 02.06.2010 14:05
Почтовый сервер panmaster Софт 20 23.09.2009 21:41
Почтовый клиент Mercurium Помощь студентам 3 22.09.2009 16:28