2012-04-27 3 views
2

Если есть строка для user_id, то я хочу обновить, если не вставить (но мне сказали использовать замену). В таблице есть id (который является первичным ключом, auto inc) и user_id (индекс, сессия относится к). У меня есть форма, что, когда изменяются данные он должен быть изменен в базе данных для конкретного пользователя в сессии, в противном случае он просто добавляется для конкретного пользователя в сессииupdate then replace dies

if (empty($err)) { 

     $thesis_Name = mysql_real_escape_string($_POST['thesis_Name']); 
     $abstract = mysql_real_escape_string($_POST['abstract']); 



$query="UPDATE thesis SET thesis_Name ='$thesis_Name', 
abstract='$abstract' WHERE id='$_SESSION[user_id]' 
IF ROW_COUNT()=0 
REPLACE INTO thesis (thesis_Name,abstract)VALUES ('$thesis_Name', '$abstract') 
"; 

mysql_query($query) or die(); 

// query is ok? 
if (mysql_query($the_query, $link)){ 

// redirect to user profile 
header('Location: myaccount.php?id=' . $user_id); 
     } 

С этой страницы просто умирает.

EDIT:

`thesis` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`user_id` int(11) NOT NULL, 
`thesis_Name` varchar(200) NOT NULL, 
`abstract` varchar(200) NOT NULL, 

PRIMARY KEY (`id`), 
KEY `user_id` (`user_id`) 
) 

Большое спасибо

+0

Вы ** действительно ** должны использовать подготовленные заявления! Если вы не знаете, как и почему, читайте о [Bobby Tables] (http://bobby-tables.com). – eggyal

+0

@eggyal: 'php :: mysql' не поддерживает их. '$ _SESSION' не предоставляется пользователям, другие переменные экранируются. – Quassnoi

+0

@Quassnoi: Справедливая точка ... хотя это все еще заставляет меня дрожать. – eggyal

ответ

0
INSERT 
INTO thesis (id, abstract, thesis) 
VALUES ('$_SESSION[user_id]', '$abstract', '$thesis_Name') 
ON DUPLICATE KEY 
UPDATE 
     abstract = VALUES(abstract), 
     thesis_Name = VALUES(thesis_Name) 
+0

Я получаю красные линии везде с этим? Ive положил скобку в конце значений – user1296762

+0

@ user1296762: см. Обновление. – Quassnoi

+0

будет ли это иметь какое-либо отношение к тому, что я вторгаю в поле? – user1296762

0

Вам не нужно делать UPDATE первый - REPLACE обрабатывает все это для вас. Из MySQL manual:

REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новую строку для PRIMARY KEY или индекса UNIQUE, старая строка удаляется перед новой строкой вставляется. См. Section 13.2.5, “INSERT Syntax”.

Таким образом, до тех пор, id является уникальным ключом в вашем thesis таблице, только SQL вам нужно:

REPLACE INTO thesis (id, thesis_Name, abstract) 
VALUES ('$_SESSION[userid]', '$thesis_name', '$abstract'); 
+0

просто вставляя это, дает мне ошибки красной строки везде :( – user1296762

+1

'REPLACE' устарел и менее эффективен, чем' INSERT ... ON DUPLICATE KEY UPDATE'. При нажатии клавиши «DELETE» следует 'INSERT' (2 операции) против «UPDATE» (1 операция или даже нет-op, если обновленные значения соответствуют старым). – Quassnoi

+0

@ user1296762: Где вы вставляете его? Где вы видите «красные линии»? к тому, о чем вы говорите. – eggyal

0

Вы можете сделать это с подготовленной statements.You можно увидеть пример SQL;

DROP PROCEDURE IF EXISTS `UPDATETHESIS` 

| 

CREATE PROCEDURE `UPDATETHESIS` (IN _id VARCHAR(50), IN _thesis_name VARCHAR(50), IN _abstract VARCHAR(50)) 

    NOT DETERMINISTIC 

    CONTAINS SQL 

    SQL SECURITY INVOKER 

IF EXISTS (SELECT * FROM thesis WHERE id = _id) 
    BEGIN 
     UPDATE thesis SET thesis_Name = _thesis_name, 
     abstract = _abstract WHERE id = _id  
    END 
ELSE 
    BEGIN 
     INSERT INTO thesis (thesis_Name,abstract) VALUES (_thesis_name, _abstract) 
    END 

Вы можете назвать это как CALL UPDATETHESIS(userid, thesis_name, abstratc);

+1

Вопрос помечен 'mysql'. – Quassnoi

0

Есть в вашем коде несколько вещей, которые создают проблемы. Сначала вам не нужно делать вставку и замену в том же запросе: replace будет вставляться, если нет строки для замены (кроме того, я даже не уверен, что синтаксис sql, который вы используете, является правильным) ...

Затем вы делаете mysql_query($query) or die(), который, вероятно, там, где ваш код умирает (возможно, из-за того, что синтаксис sql, который вы использовали, может быть неправильным).

Сразу после этого вы снова вызываете mysql_query, который повторяет запрос во второй раз. В любом случае, если ваш запрос не работает, код умер бы на предыдущей строке ...

Что вы могли бы сделать

$query = "REPLACE INTO blablabla"; 
if (!mysql_query($query)) 
echo "the query failed"; 
else header ("location:blabla"); 

но ваш запрос должен упомянуть, для которых user_id вы хотите обновите как это ЗАМЕНИТЕ В ТЕЗИСЕ (id, thesis_Name, abstract) VALUES ('{$ _SESSION [userid]}', '$ thesis_name', '$ abstract');

+0

Мне пришлось избавиться от {} круглого сеанса, или это давало ошибки. данные по-прежнему не изменяются в базе данных, хотя – user1296762