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

Форум MySQL

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

 

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

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

тема: Как построить запрос к базе данных?
 
 автор: maxim14   (04.04.2011 в 18:22)   письмо автору
 
 

Приведенный ниже скрипт работает но обновляет данные в базе только по id. Как построить запрос к базе, чтоб он еще проверял соответствие второго столбца `code` ?


[code][

<?
$arr = file("Полная база.txt");
$sql = array();

for($i = 0; $i < count($arr); $i++)
{
$arr[$i] = trim($arr[$i]);
$line = explode("\t", $arr[$i]);
$sql[] = "('{$line[0]}',
'{$line[1]}',
'{$line[2]}',
'{$line[3]}',
'{$line[4]}',
'{$line[5]}',
'{$line[6]}',
'{$line[7]}'
)";
if ($line[3]>=1)
{
$line[3]=$line[3]-$line[3]*0.05
;
echo "<pre>";
print_r($line[3]);
echo "</pre>";
}
$query = ("UPDATE `trika_towar`
SET `price`=$line[3]) WHERE `id`=$line[0]");
mysql_query($query) ;
}

if(!mysql_query($query)) exit("Запрос не выполнился по тому, что ".mysql_error());



?>

/code]

  Ответить  
 
 автор: cheops   (04.04.2011 в 18:53)   письмо автору
 
   для: maxim14   (04.04.2011 в 18:22)
 

>чтоб он еще проверял соответствие второго столбца `code` ?
А соответствие столбца `code` чему?

  Ответить  
 
 автор: maxim14   (04.04.2011 в 18:54)   письмо автору
 
   для: cheops   (04.04.2011 в 18:53)
 

>>чтоб он еще проверял соответствие второго столбца `code` ?
>А соответствие столбца `code` чему?

$line[1] то есть они должны быть одинаковы, а при отсутствии соответствий создавать новую строку и вносить данные из текста

  Ответить  
 
 автор: cheops   (04.04.2011 в 22:02)   письмо автору
 
   для: maxim14   (04.04.2011 в 18:54)
 

Хм... а может проще столбец code проиндексировать уникальным ключом? Тогда вставить данные с дублирующей записью просто не получится.

  Ответить  
 
 автор: maxim14   (05.04.2011 в 17:06)   письмо автору
 
   для: cheops   (04.04.2011 в 22:02)
 

Понимаете в чем смысл - в базе уже есть товары, а нужно на имеющиеся сделать скидку 5% от цены в текстовом документе и добавить недостающие товары

  Ответить  
 
 автор: cheops   (05.04.2011 в 18:58)   письмо автору
 
   для: maxim14   (05.04.2011 в 17:06)
 

Тогда перед добавлением придется делать SELECT-запрос, проверяющий имеется ли в таблице запись с таким code.

  Ответить  
 
 автор: maxim14   (05.04.2011 в 19:22)   письмо автору
 
   для: cheops   (05.04.2011 в 18:58)
 

Это я понял. Примерно так?

<?
$arr 
file("Полная база.txt");
   
$sql = array();
   
   for(
$i 0$i count($arr); $i++)  
  {  
    
$arr[$i] = trim($arr[$i]);  
    
$line explode("\t"$arr[$i]);  
    
$sql[] = "('{$line[0]}', 
               '
{$line[1]}', 
               '
{$line[2]}', 
               '
{$line[3]}', 
               '
{$line[4]}', 
               '
{$line[5]}', 
               '
{$line[6]}', 
                '
{$line[7]}'
               )"
;  
     
$line[3]= $line[3]-($line[3]*0.05);
     
     echo 
"<pre>";
  
print_r($sql);
  echo 
"</pre>";  
     
     if (
mysql_quere(SELECT FROM trika_towar WHERE code$line[1]");
     {
     
$status= 1 ;
     
$query1= ("UPDATE trika_towar SET price=`$line[3]`,p1004=`$line[3]`, status = `$statusWHERE code= `$line[1]` ");
     mysql_query(
$query1);
     
     }
     else
     {
    
     
$query = (" INSERT INTO`trika_towar`(`code`, `name`,`price`, `fas`, `doza`, `made`, `made_country`) VALUES ($line[1],$line[2],$line[3],$line[4],$line[5],$line[6],$line[7]");
     mysql_query(
$query);
    
     
   
     }   
}
  if(!mysql_query(
$query)) exit("Запрос не выполнился по томучто ".mysql_error());  

 

?> 


Только вот с синтаксисом разобраться не могу

  Ответить  
 
 автор: maxim14   (05.04.2011 в 20:36)   письмо автору
 
   для: maxim14   (05.04.2011 в 19:22)
 

Переделал код вот так:

<?
$arr 
file("Полная база.txt");
   
$sql = array();
   
   for(
$i 0$i count($arr); $i++)  
  {  
    
$arr[$i] = trim($arr[$i]);  
    
$line explode("\t"$arr[$i]);  
    
$sql[] = "('{$line[0]}', 
               '
{$line[1]}', 
               '
{$line[2]}', 
               '
{$line[3]}', 
               '
{$line[4]}', 
               '
{$line[5]}', 
               '
{$line[6]}', 
                '
{$line[7]}'
               )"
;  
     
$line[3]= $line[3]-($line[3]*0.05);
     
     echo 
"<pre>";
  
print_r($sql);
  echo 
"</pre>";  
     
    
$result=mysql_query("SELECT * FROM `trika_towar` WHERE code= `$line[0]`");
    echo 
$result;
    if (
$result=='true')
     {
     
$status;
     
$query1=("UPDATE `trika_towar` SET price=`$line[3]`,p1004=`$line[3]`, status =`$status` WHERE code= `$line[1]`");
     
mysql_query($query1);
     
     }
     else
     {
    
     
$query = (" INSERT INTO`trika_towar`(`code`, `name`,`price`, `fas`, `doza`, `made`, `made_country`) VALUES ($line[1],$line[2],$line[3],$line[4],$line[5],$line[6],$line[7]");
     
mysql_query($query);
    
     
   
     }   
}
  if(!
mysql_query($query)) exit("Запрос не выполнился по тому, что ".mysql_error());  

 

?> 



Теперь он почему-то выполняется в таком цикле:


;

Array
(
[0] => ('0.',
'110009242',
'01-К Костыли подмышечные дерев. (под рост 140-170см), СИМС-2',
'557',
'1',
'1',
'Valentine International',
'Тайвань'
)
)

Array
(
[0] => ('0.',
'110009242',
'01-К Костыли подмышечные дерев. (под рост 140-170см), СИМС-2',
'557',
'1',
'1',
'Valentine International',
'Тайвань'
)
[1] => ('229.',
'110008076',
'10019/GR Резиновая насадка д/тростей (серая) 25мм , СИМС-2',
'36',
'1',
'1',
'Valentine International',
'Тайвань'
)
)

Array
(
[0] => ('0.',
'110009242',
'01-К Костыли подмышечные дерев. (под рост 140-170см), СИМС-2',
'557',
'1',
'1',
'Valentine International',
'Тайвань'
)
[1] => ('229.',
'110008076',
'10019/GR Резиновая насадка д/тростей (серая) 25мм , СИМС-2',
'36',
'1',
'1',
'Valentine International',
'Тайвань'
)
[2] => ('230.',
'40000580',
'10021 Костыли подмышечные (под рост 140-160см), СИМС-2',
'970',
'1',
'1',
'Valentine International',
'Тайвань'
)
)

Array
(
[0] => ('0.',
'110009242',
'01-К Костыли подмышечные дерев. (под рост 140-170см), СИМС-2',
'557',
'1',
'1',
'Valentine International',
'Тайвань'
)
[1] => ('229.',
'110008076',
'10019/GR Резиновая насадка д/тростей (серая) 25мм , СИМС-2',
'36',
'1',
'1',
'Valentine International',
'Тайвань'
)
[2] => ('230.',
'40000580',
'10021 Костыли подмышечные (под рост 140-160см), СИМС-2',
'970',
'1',
'1',
'Valentine International',
'Тайвань'
)
[3] => ('231.',
'20001310',
'10022 Костыли подмышечные (под рост 160-180см), СИМС-2',
'961',
'1',
'1',
'Valentine International',
'Тайвань'
)

А потом вообще останавливается. Почему? Зараннее спасибо!

  Ответить  
 
 автор: cheops   (05.04.2011 в 20:57)   письмо автору
 
   для: maxim14   (05.04.2011 в 20:36)
 

Это не совсем корректно, mysql_query() не возвращает логическое true, она возвращает дескриптор запроса, по которому можно получить результат. В вашем случае разумнее просто получить количество найденных строк, например так (следует обратить внимание, что обратные кавычки применяются только для имен столбцов и таблиц, к данным следует применять одиночные кавычки)
<?php
  
...
  
// MySQL-функция COUNT() возвращает количество строк
  
$query "SELECT COUNT(*) FROM `trika_towar` WHERE code= '$line[0]'";
  
$result mysql_query($query); 
  if(!
$result) exit("Ошибка - ".mysql_error());
  if (
mysql_result($result0))
  {
     
// Соответствие найдено
  
}
  else
  {
     
// Соответствие не найдено
  
}
?>

  Ответить  
 
 автор: maxim14   (05.04.2011 в 22:35)   письмо автору
 
   для: cheops   (05.04.2011 в 20:57)
 

Переделал скрипт вот так:

<?
$arr 
file("Полная база Трики1.txt");
  
$sql = array();
   
   for(
$i 0$i count($arr); $i++)  
  {  
    
$arr[$i] = trim($arr[$i]);  
    
$line explode("\t"$arr[$i]);  
   
$sql[] = "('{$line[0]}', 
               '
{$line[1]}', 
               '
{$line[2]}', 
               '
{$line[3]}', 
               '
{$line[4]}', 
               '
{$line[5]}', 
               '
{$line[6]}', 
                '
{$line[7]}'
               )"
;
              if (
$line[3]>=1)
              {
               
$line[3]=$line[3]-$line[3]*0.05
               
;  
     echo 
"<pre>";
  
print_r($line[3]);
  echo 
"</pre>"
  
$query "SELECT COUNT(*) FROM `trika_towar` WHERE code= '$line[1]'";
  
$result mysql_query($query); 
  if(!
$result) exit("Ошибка - ".mysql_error());
  if (
mysql_result($result0))
  {
   
$query1=("UPDATE `trika_towar` SET price='$line[3]',p1004='$line[3]', status ='$status' WHERE code= '$line[1]'");
     
mysql_query($query1);   // Соответствие найдено
  
}
  else
  {
   
$query = (" INSERT INTO`trika_towar`(`code`, `name`,`price`, `fas`, `doza`, `made`, `made_country`) VALUES ('$line[1]','$line[2]','$line[3]','$line[4]','$line[5]','$line[6]','$line[7]'");
     
mysql_query($query); // Соответствие не найдено
  
}  
     }   
      }
  if(!
mysql_query($query)) exit("Запрос не выполнился по тому, что ".mysql_error());  

   

?> 



Цены меняет отлично, а вот новые записи не добовляет

  Ответить  
 
 автор: cheops   (05.04.2011 в 23:03)   письмо автору
 
   для: maxim14   (05.04.2011 в 22:35)
 

Поставьте проверку на INSERT - может какая-то ошибка возникает
<?php
  
...
  if(!
mysql_query($query)) exit("При вставке INSERT возникает ошибка - ".mysql_error());
  ...
?>

  Ответить  
 
 автор: maxim14   (06.04.2011 в 00:32)   письмо автору
 
   для: cheops   (05.04.2011 в 23:03)
 

Ошибка следующая:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Я понимаю, что это связано с кавычками, а найти где не могу, как их только не расставлял

  Ответить  
 
 автор: cheops   (06.04.2011 в 01:00)   письмо автору
 
   для: maxim14   (06.04.2011 в 00:32)
 

У вас нет закрывающей скобки для выражения VALUE().

  Ответить  
 
 автор: maxim14   (06.04.2011 в 04:51)   письмо автору
 
   для: cheops   (06.04.2011 в 01:00)
 

Вы просто волшебник! Книжки это конечно хорошо, а не подскажете как сами то учились?

  Ответить  
 
 автор: cheops   (06.04.2011 в 10:16)   письмо автору
 
   для: maxim14   (06.04.2011 в 04:51)
 

Ну кое-что о том как было дело можно почитать тут. А вообще как увидел компьютеры понял, что мое, с тех пор каждый год стараюсь изучить 2-3 технологии или языка программирования (дома везде книги по программированию - на полках, на столах, на полу - не думаю, что даже половину из них прочитал). А учился как и все: и пол года писал первую программу из 500 строк на Фортране, и по 2 дня искал забытую точку с запятой в C++ классах, и по три раза принимался изучать регулярные выражения, пока не осилил и боялся многотабличные UPDATE и DELETE запросы выполнять... Все изучается примерно одинаково: сначала долго и мучительно, потом быстрее и быстрее, пока вы не выходите на уровень асса и просто выбираете из памяти нужный язык программирования для решения проблемы.

  Ответить  
Rambler's Top100
вверх

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