Запутался, как написать это простое ОБНОВЛЕНИЕ / ВСТАВКА - PullRequest
1 голос
/ 09 января 2009

ОК, я запутался, как написать INSERT / UPDATE для этого простого приложения, которое я разрабатываю локально, чтобы узнать больше о взаимодействиях с БД.

У меня есть страница «редактировать», которая заполняется из БД и содержит до 9 пользовательских ссылок ( user_id 2 в данном случае), поэтому что-то вроде:

<input type="text" name="link1" value="www.yahoo.com">  
<input type="text" name="link2" value="www.google.com">  
<input type="text" name="link3" value="www.amazon.com">  
<input type="text" name="link4" value="">  
<input type="text" name="link5" value="">  
<input type="text" name="link6" value="">  
<input type="text" name="link7" value="">  
<input type="text" name="link8" value="">  
<input type="text" name="link9" value="">  
<input type="submit" name="submitted" value="update">

Здесь должно отображаться 9 текстовых входов, первые 3 входа заполнены URL-адресами из таблицы ссылок ниже ... Эти входные данные не отображаются в моем вопросе, даже если они есть в моем предварительный просмотр.

Мои ссылки * Таблица 1013 * состоит из двух столбцов и выглядит следующим образом:

user_id     linkurl
1           http://www.abcnews.com

2           http://www.yahoo.com
2           http://www.google.com        
2           http://www.amazon.com

3           http://www.ebay.com
3           http://www.craigslist.org

Как мне написать запрос INSERT / UPDATE, скажем, для редактирования 3-й ссылки и добавления 4-й, возможно 5-й, 6-й, 7-й, 8-й и 9-й?

У меня также есть на этой же странице раздел для личной информации пользователя, и я могу легко обновить его с помощью запроса:

$query = "UPDATE users
          SET first_name='$firstname', last_name='$lastname', email='$email', state='$state'"  

if($newpass1){
    $query .= ", pass=md5('$newpass1')";
}

$query .= " WHERE user_id = {$_SESSION['user_id']}";

Ответы [ 4 ]

2 голосов
/ 09 января 2009

Самый простой способ, которым я могу придумать, - это изменить ваш html на что-то вроде этого

<input type="text" name="link1" value="www.yahoo.com">  
<input type="hidden" name="oldlink1" value="www.yahoo.com">  
<input type="text" name="link2" value="">  
<input type="hidden" name="oldlink2" value=""> 

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

UPDATE table_name SET linkurl='www.mynewlink.com' 
WHERE linkurl='www.yahoo.com' and user_id=1
1 голос
/ 09 января 2009

Я не очень понимаю, с чем у вас проблемы. Было бы полезно, если бы вы показали что-то, что вы попробовали, но не сделали то, что хотели.

Один совет, который у меня есть, вы, вероятно, хотите добавить столбец link_id в таблицу ссылок. Это значительно облегчит уникальную идентификацию каждой строки и сохранит исходный порядок ввода. (Я не знаю о реализации MySQL, но в общей теории RDBMS вы не должны предполагать, что строки хранятся в том порядке, в котором они были вставлены.)

Подробнее: Я думаю, что link_id будет числом от 1 до 9, так что user_id и link_id вместе однозначно идентифицируют строку в таблице ссылок. Я не думаю, что это реализуемо через автоинкремент, но я не знаю mysql. Когда вы выбираете из таблицы, это будет что-то вроде «ВЫБЕРИТЕ URL-адрес ИЗ ССЫЛКИ, ГДЕ user_id = 3 ORDER BY link_id»; это будет держать ссылки в правильном порядке. Когда форма будет отправлена, я думаю, вы определите значение link_id по номеру поля. Предполагая, что в вашей среде есть способ определения количества строк, затронутых операцией SQL, я бы посоветовал вам попробовать обновить, например, «UPDATE links SET url = 'newvalue' WHERE user_id = 3 AND link_id = 4", тогда если отчеты 0 обновленных строк вместо этого делают INSERT.

P.S. Я знаю, что вы сказали, что это учебный проект, но по мере продвижения вперед, пожалуйста, прочитайте об SQL-инъекции и о том, как этого избежать!

0 голосов
/ 09 января 2009

Я бы рекомендовал добавить в таблицу уникальный идентификатор строки (например, столбец идентификаторов в SQL Server) и использовать его, чтобы решить, какие записи обновлять. Операции без идентификатора строки обязательно будут вставлены.

0 голосов
/ 09 января 2009

Таким образом, я бы, вероятно, удалил все существующие записи для пользователя, а затем заново их заполнил:

$query = "DELETE FROM links WHERE user_id = {$_SESSION['user_id']}";
foreach ($i = 1; $i < 10; $i++) {
  if (!empty($_POST['link' . $i])) {
    $query = "INSERT INTO links (user_id, linkurl) VALUES ({$_SESSION['user_id']}, '" . $_POST['link' . $i] . "')";
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...