Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Узнать существование ID
 
 автор: Specter   (07.06.2007 в 15:08)   письмо автору
 
 

Каким запросом можно узнать есть ли в таблице USERS указанный id?
Если есть, то надо перезаписать поле text с этим id, а если нет, то нужно создать новое поле с указанным id и записать туда данные. Как это можно сделать?

   
 
 автор: Trianon   (07.06.2007 в 15:13)   письмо автору
 
   для: Specter   (07.06.2007 в 15:08)
 

если id - это первичный ключ, и при обновлении нужно изменить все поля, кроме него, можно воспользоваться запросом REPLACE (синтаксис такой же как у INSERT)
Если меняется лишь часть полей - придется писать три запроса.

SELECT count(id) FROM tab WHERE id = $id;
и затем по результатам исполнять либо INSERT либо UPDATE

   
 
 автор: Specter   (07.06.2007 в 15:43)   письмо автору
 
   для: Trianon   (07.06.2007 в 15:13)
 

Нет. Id не первичный ключ. Ну скажем так: нужно найти в таблице поле id и изменить поля, которые относятся к нему.
Вот таблица если что

CREATE TABLE `votes` (
`nid` int(4) NOT NULL auto_increment,
`id` int(4) NOT NULL,
`name` text,
PRIMARY KEY (`id`)
) TYPE=MyISAM;

Вот здесь нужно найти допустим значение 222 для id-а и изменить поле name где id=222, а если такога id нет, то нужно его создать.

   
 
 автор: Trianon   (07.06.2007 в 15:46)   письмо автору
 
   для: Specter   (07.06.2007 в 15:43)
 

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

   
 
 автор: Specter   (07.06.2007 в 15:50)   письмо автору
 
   для: Trianon   (07.06.2007 в 15:46)
 

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

   
 
 автор: Trianon   (07.06.2007 в 15:56)   письмо автору
 
   для: Specter   (07.06.2007 в 15:50)
 

что вызывает сложности?
Показывайте код.
Иначе это будет не Ваш первый скрипт, а мой.

   
 
 автор: Specter   (07.06.2007 в 16:29)   письмо автору
 
   для: Trianon   (07.06.2007 в 15:56)
 

Я незнаю как проверить существование ID в таблице.

   
 
 автор: Trianon   (07.06.2007 в 16:38)   письмо автору
 
   для: Specter   (07.06.2007 в 16:29)
 


$sql = "SELECT COUNT(id) FROM tab WHERE id = $id";
$res = mysql_query($sql) or die("Error in $sql: ".mysql_error());
$num = mysql_result($res, 0);
echo $num;

   
 
 автор: Specter   (07.06.2007 в 18:04)   письмо автору
 
   для: Trianon   (07.06.2007 в 16:38)
 

Если я правильно понял, то должно быть так
 
$SQL = "SELECT COUNT(id) FROM votes WHERE id='".$'id'."'";
$q = mysql_query($SQL);
$num = mysql_result($q, 0);
if(!$num) {
$query = mysql_query("INSERT INTO `votes` VALUES(0, '".$id."', '".$_POST['q']."')");    } 

да?

   
 
 автор: Trianon   (07.06.2007 в 18:33)   письмо автору
 
   для: Specter   (07.06.2007 в 18:04)
 

Врете.
Этот скрипт такого написать не может.

   
 
 автор: Specter   (07.06.2007 в 18:40)   письмо автору
 
   для: Trianon   (07.06.2007 в 18:33)
 

Если я правильно понял, то должно быть так
 
$SQL = "SELECT COUNT(id) FROM votes WHERE id='".$'id'."'";
$q = mysql_query($SQL);
$num = mysql_result($q, 0);
if(!$num) {
$query = mysql_query("INSERT INTO `votes` VALUES(0, '".$id."', '".$_POST['q']."')");    } 

да?

   
 
 автор: Specter   (07.06.2007 в 18:41)   письмо автору
 
   для: Trianon   (07.06.2007 в 18:33)
 

Если я правильно понял, то должно быть так
 
$SQL = "SELECT COUNT(id) FROM votes WHERE id='".$'id'."'";
$q = mysql_query($SQL);
$num = mysql_result($q, 0);
if(!$num) {
$query = mysql_query("INSERT INTO `votes` VALUES(0, '".$id."', '".$_POST['q']."')");    } 

да?

   
 
 автор: Trianon   (07.06.2007 в 18:45)   письмо автору
 
   для: Specter   (07.06.2007 в 18:41)
 

нет.

   
 
 автор: mr Bin   (07.06.2007 в 20:45)   письмо автору
 
   для: Specter   (07.06.2007 в 18:41)
 

Я бы переписал так:
<?php
$SQL 
mysql_query("SELECT COUNT(id) FROM votes WHERE id='".$id."'");
if(
mysql_num_rows($SQL) == 0) { mysql_query("INSERT INTO `votes` VALUES(0, '".$id."', '".$_POST['q']."')"); } else { mysql_query("UPDATE `votes` SET `text` = '".$_POST['q']."' WHERE `id` = '".$id."'"); }
?>

   
 
 автор: Loki   (07.06.2007 в 17:13)   письмо автору
 
   для: Trianon   (07.06.2007 в 15:13)
 

если это первичный ключ, то можно воспользоваться вот такой конструкцией
INSERT ... ON DUPLICATE KEY UPDATE

   
 
 автор: Trianon   (07.06.2007 в 17:25)   письмо автору
 
   для: Loki   (07.06.2007 в 17:13)
 

Во первых, (added in MySQL 4.1.0)
Во вторых, новичку я бы такое не посоветовал, даже зная, что у него свежий сервер.

   
 
 автор: Specter   (07.06.2007 в 19:12)   письмо автору
 
   для: Trianon   (07.06.2007 в 17:25)
 

А как правильно?
У меня мой вариант работает. :)

   
 
 автор: Trianon   (07.06.2007 в 19:22)   письмо автору
 
   для: Specter   (07.06.2007 в 19:12)
 

если работает, значит вопрос закрыт. :)

   
 
 автор: Specter   (07.06.2007 в 19:44)   письмо автору
 
   для: Trianon   (07.06.2007 в 19:22)
 

Ну скажите как правильнее. Может мой код будет тормозить раз он не правильный. :)

   
 
 автор: Trianon   (07.06.2007 в 19:48)   письмо автору
 
   для: Specter   (07.06.2007 в 19:44)
 

WHERE id='".$'id'."'";
это мне непонятно.

   
 
 автор: Specter   (07.06.2007 в 20:02)   письмо автору
 
   для: Trianon   (07.06.2007 в 19:48)
 

WHERE id='".$id."'" :)

   
 
 автор: Specter   (07.06.2007 в 20:03)   письмо автору
 
   для: Trianon   (07.06.2007 в 19:48)
 

WHERE id='".$id."'" :)

   
 
 автор: Trianon   (07.06.2007 в 20:06)   письмо автору
 
   для: Specter   (07.06.2007 в 20:03)
 

чем это лучше чем то, что написано у меня?

   
 
 автор: Specter   (07.06.2007 в 20:11)   письмо автору
 
   для: Trianon   (07.06.2007 в 20:06)
 

Так это одно и то же.
Я просто спрашиваю я с условием все правильно сделал? Или надо было как-то по-другому делать? :)

   
 
 автор: mr Bin   (07.06.2007 в 20:11)   письмо автору
 
   для: Trianon   (07.06.2007 в 20:06)
 

>WHERE id='".$'id'."'";
>это мне непонятно.

Может ГЕТом передаёт номер, который искать.. Тока с кавычками напутал.. Да и в коде лишняя фигурная скобка.. значит не всё нам выдаёт..

   
 
 автор: Trianon   (07.06.2007 в 20:07)   письмо автору
 
   для: Specter   (07.06.2007 в 20:03)
 

.

   
 
 автор: Trianon   (07.06.2007 в 20:07)   письмо автору
 
   для: Specter   (07.06.2007 в 20:03)
 

.

   
 
 автор: Specter   (07.06.2007 в 20:34)   письмо автору
 
   для: Trianon   (07.06.2007 в 20:07)
 

Я просто код с скрипта скопировал с скобкой. А так ведь я правильно понял, что если id существует, то $num будет равен true?

   
 
 автор: Trianon   (07.06.2007 в 21:04)   письмо автору
 
   для: Specter   (07.06.2007 в 20:34)
 

Это не одно и то же.

Неправильно.
В $num будет записано число строк в таблице, поле id в которых равно искомому.

   
 
 автор: mr Bin   (07.06.2007 в 22:06)   письмо автору
 
   для: Trianon   (07.06.2007 в 21:04)
 

Эм, я не правильно написал?

   
 
 автор: Trianon   (07.06.2007 в 22:21)   письмо автору
 
   для: mr Bin   (07.06.2007 в 22:06)
 

Включите линейный режим форума. В нем написано, кто кому отвечает.

   
 
 автор: mr Bin   (07.06.2007 в 23:09)   письмо автору
 
   для: Trianon   (07.06.2007 в 22:21)
 

Я видел, что Вы ответили ему. Но часто так бывает, что независимо от ника отвечают...
И я подумал, что Вы каким-то образом адресовали первую строчку мне... Понял.

И всё же, я правильный код составил? :) Или и ко мне есть претензии?

   
 
 автор: Trianon   (08.06.2007 в 00:57)   письмо автору
 
   для: mr Bin   (07.06.2007 в 23:09)
 

у меня? Претензий - нет.
Замечания... как обычно:
Логические ошибки: функция mysql_num_rows всегда вернет 1 независимо от количества строк в таблице,
непонятен источник возникновения переменной $id,
отсутствует восстановление данных после искажения механизмом магических кавычек,
отсутствует экранирование при образовании литеральных констант MySQL-кода.
стилистические ошибки:
целочисленное (вроде как) поле id сравнивается со строковым литералом,
отсутствует явное перечисление имен полей в операторе INSERT.

   
 
 автор: mr Bin   (08.06.2007 в 01:10)   письмо автору
 
   для: Trianon   (08.06.2007 в 00:57)
 

>mysql_num_rows всегда вернет 1 независимо от количества строк в таблице
Странно, меня никогда это ещё не подводило. Если такого нет в таблице, то значит нет.

>непонятен источник возникновения переменной $id
Ну я тоже не знаю, а втору виднее.. я только подстроился под него..

>отсутствует восстановление данных после искажения механизмом магических кавычек,
>отсутствует экранирование при образовании литеральных констант MySQL-кода.
Ну я не вдавался в такие подробности, это лишь краткий пример..

>целочисленное (вроде как) поле id сравнивается со строковым литералом,
>отсутствует явное перечисление имен полей в операторе INSERT.
Опять же.. какой запрос автор опубликовал, такой я и вставил для примера, чтобы ему было понятнее, что откуда берется..

p.s. Называется напросился :(

   
 
 автор: Trianon   (08.06.2007 в 01:17)   письмо автору
 
   для: mr Bin   (08.06.2007 в 01:10)
 

>>mysql_num_rows всегда вернет 1 независимо от количества строк в таблице
>Странно, меня никогда это ещё не подводило. Если такого нет в таблице, то значит нет.

Вы не заметили, что запрос - SELECT COUNT(id) - Такой запрос всегда вернет одно значение независимо от числа строк в таблице.

Я заметил, что большинство огрехов - автора.
Но Вы же назвали код своим... Получите, что называется, и распишитесь :)

   
 
 автор: mr Bin   (08.06.2007 в 01:30)   письмо автору
 
   для: Trianon   (08.06.2007 в 01:17)
 

Я отказываюсь от авторства!
Да, действительно, не заметил каунта.. Если б сам с нуля писал - не ошибся бы..

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования