Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Динамический запрос к базе данных!!!


Автор: Tangash 14.11.2006, 10:27
Задача!!!

Существует база данных пользователей
- имя
- адрес
- телефон
- сайт
- e-mail

Существует форма изменения данных пользователей
- имя
- адрес
- телефон
- сайт
- e-mail

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

Автор: skyboy 14.11.2006, 10:35
что значит "не получается"? код привести сложно? (подсказываю: HTML-код формы и код PHP-обработчика) Тогда и посмотрим...

Автор: Tangash 14.11.2006, 10:43
Вот код запроса...

$query ="UPDATE `USERS` SET 1";
   if (!empty($newname)) $query .= " , `name` = '".$newname."'";
   if (!empty($newaddress)) $query .= " , `address` = '".$newaddress."'";
   if (!empty($newtel)) $query .= " , `tel` = '".$newtel."'";
   if (!empty($newsite)) $query .= " , `site` = '".$newsite."'";
   if (!empty($newemail)) $query .= " , `email` = '".$newemail."'";
   if (!empty($newpass)) $query .= " , `pass` = '".$newpass."'";
   $query .= " WHERE `id` = '".$id."'";
//выполняем запрос
$r=mysql_query($query);

$newname, $newaddress... это переменные уже поученные из формы...

но этот запрос не работает... не могу ошибку найти...

Автор: skyboy 14.11.2006, 10:52
пункт 1. оформляй код при помощи кнопки "Код" справа выше поля ввода сообщения: и нам проще читать(кто помочь пытается) и сам можешь найти очепятки благодаря подсветке синтаксиса.
пункт 2. что выдает mysql_error?

Автор: Tangash 14.11.2006, 10:55
mysql ничего не выдает, ошибки нет, только обновление записи не происходит, вот вчем проблема...

Добавлено @ 10:56 
Код

$query ="UPDATE `USERS` SET 1";
   if (!empty($newname)) $query .= " , `name` = '".$newname."'";
   if (!empty($newaddress)) $query .= " , `address` = '".$newaddress."'";
   if (!empty($newtel)) $query .= " , `tel` = '".$newtel."'";
   if (!empty($newsite)) $query .= " , `site` = '".$newsite."'";
   if (!empty($newemail)) $query .= " , `email` = '".$newemail."'";
   if (!empty($newpass)) $query .= " , `pass` = '".$newpass."'";
   $query .= " WHERE `id` = '".$id."'";
//выполняем запрос
$r=mysql_query($query);


$newname, $newaddress... это переменные уже поученные из формы...

Автор: skyboy 14.11.2006, 10:57
вообще, конструкция вида UPDATE ... SET 1, вызывает ошибку. Если хочешь сделать, как собирался(добавлять строки с запятой впереди) прописывай поле, которое никак не будет изменяться. Например, так:
Код

UPDATE `users` SET `id`=`id` .....


Добавлено @ 10:58 
Цитата(Tangash @  14.11.2006,  09:55 Найти цитируемый пост)
mysql ничего не выдает

у меня выдало. странный у тебя какой-то MySQL

Автор: Tangash 14.11.2006, 11:04
непонятно... всмысле не меняющееся поле? мне нужно чтобы изменились только те поля которые внес пользователь...

Автор: skyboy 14.11.2006, 11:10
Код

UPDATE `users` SET 1

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

Добавлено @ 11:15 
вставь после формирования запроса echo $query, скопируй выданный запрос и брось сюда. а еще лучше - воспользуйся доступом к своей БД и запусти этот запрос в том же phpMyAdmin, или в любом другом средстве связи с базой. и скажи, произошло обновление или нет.

Автор: Tangash 14.11.2006, 11:17
а запятая в запросе выдаст ошибку???
например

Код

$query ="UPDATE `USERS` SET , `name` = '".$newname."' WHERE id='".$id."'";


Автор: skyboy 14.11.2006, 11:29
а сам-то как думаешь?

Добавлено @ 11:33 
конечно, выдаст. почему бы не сделать так:
Код

$query ="UPDATE `USERS` SET id=id, `name` = '".$newname."' WHERE id='".$id."'";

или так:
Код

$flag= true;
$query ="UPDATE `USERS` SET ";
   if (!empty($newname)) 
   {
     $query .= ($flag?', ':'')." `name` = '".$newname."'";
     $flag= false;
   }
   if (!empty($newaddress)) 
   {
     $query .= ($flag?', ':'')." `address` = '".$newaddress."'";
     $flag= false;
   }
........

Автор: Tangash 14.11.2006, 14:39
Не работает твой код!!! Он работает если только введено первое значение, а без него ни как...

Автор: skyboy 15.11.2006, 01:10
да я же и справшиваю: есть у тебя неизменяемые поля или нет? вот и вставил бы, чтоб даже в случае "ничего не пришло" запрос был бы корректным. А вообще - сделал бы себе флаг: если хоть что-то пришло - выполняешь запрос, если ничего нет - совсем не обрабатываешь $_GET  и запрос, соотвественно, не формируешь..
.

Автор: skyboy 15.11.2006, 10:54
хм. два решения. первое: добавлять к запросу всегда с передидущей запятой, а потом - её удалить:
Код

$query= 'UPDATE `users` SET ';
$queryAdd= '';
if (!empty($newname)) $queryAdd .= " , `name` = '".$newname."'";
if (!empty($newaddress)) $queryAdd .= " , `address` = '".$newaddress."'";
if (!empty($newtel)) $queryAdd .= " , `tel` = '".$newtel."'";
if (!empty($newsite)) $queryAdd .= " , `site` = '".$newsite."'";
if (!empty($newemail)) $queryAdd .= " , `email` = '".$newemail."'";
if (!empty($newpass)) $queryAdd .= " , `pass` = '".$newpass."'";
if($queryAdd != '') только если надо будет что-то обновлять
{
 $queryAdd[0]= ''; // удалили первую запятую
 $query= $query.$queryAdd." WHERE `id` = '".$id."'";
 mysql_query($query);
}

второе решение: использование массива для определения списка обновления:
Код

$query= 'UPDATE `users` SET ';
$queryAdd= array();
if (!empty($newname)) $queryAdd[]= "`name` = '".$newname."'";
if (!empty($newaddress)) $queryAdd[]= "`address` = '".$newaddress."'";
if (!empty($newtel)) $queryAdd[]= "`tel` = '".$newtel."'";
if (!empty($newsite)) $queryAdd[]= "`site` = '".$newsite."'";
if (!empty($newemail)) $queryAdd[]= "`email` = '".$newemail."'";
if (!empty($newpass)) $queryAdd[]= "`pass` = '".$newpass."'";
if(count($queryAdd) != 0) только если надо будет что-то обновлять
{
 $query= $query.implode(', ',$queryAdd)." WHERE `id` = '".$id."'"; // лишних запятых не будет ;)
 mysql_query($query);
}


Автор: afork 16.11.2006, 17:18
товарищи вы куда то не туда забрели , по моему все кратно проще .... 

Код

<?php
    $query="update `users` set ";
    if (!isset($_GET['name']))
    {
        $query.="1";
    }
    else 
    {
        //validation 
        if (!empty($newname)) $query .= " , `name` = '".$newname."'";
        if (!empty($newaddress)) $query .= " , `address` = '".$newaddress."'";
        if (!empty($newtel)) $query .= " , `tel` = '".$newtel."'";
        if (!empty($newsite)) $query .= " , `site` = '".$newsite."'";
        if (!empty($newemail)) $query .= " , `email` = '".$newemail."'";
        if (!empty($newpass)) $query .= " , `pass` = '".$newpass."'";
        $query .= " WHERE `id` = '".$id."'";
    }
    $result=mysql_query($query);
 ?>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)