За последние 24 часа нас посетил 53691 программист и 1765 роботов. Сейчас ищут 1463 программиста ...

Sql запрос. Если нет добавляем, если есть пропускаем.

Тема в разделе "PHP для новичков", создана пользователем [pandora], 2 ноя 2013.

  1. [pandora]

    [pandora] Активный пользователь

    С нами с:
    18 сен 2012
    Сообщения:
    71
    Симпатии:
    1
    Есть бд. Допустим actor. Нам нужно проверить, тот пост, что пришёл из формы. Если такое значение в поле есть ничего не выполняется. Если нет, то заносится новая запись.

    Код (Text):
    1. if (!empty($_POST['actors'])) {
    2.        
    3.             $res = $this->admin->sqlSelect('*', $db_pre.'actors', "name='{$_POST['actors']}'", '', 0, 1);
    4.             $result = mysql_result($res);
    5.            
    6.             if(!isset($result)){
    7.             $this->admin->sqlInsert($db_pre.'actors', 'name', "'{$_POST['actors']}'");
    8.             }
    9.        
    10.         }

    Что я не так делаю?
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    mysql_num_rows

    И вы наверника не понимаете, для чего нужен isset, у вас всегда будет true =))) даже если пустота придет...
    Вернет false только тогда, когда переменная не будет за ранее определена.
    Код (PHP):
    1. if(!empty($_POST['actors'])) {
    2.     $res=$this->admin->sqlSelect('*', $db_pre.'actors', "name='{$_POST['actors']}'", '', 0, 1);
    3.     if(!mysql_num_rows($res)){
    4.         $this->admin->sqlInsert($db_pre.'actors', 'name', "'{$_POST['actors']}'");
    5.     }
    6. }
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    вам еще не говорили про инъекции?
     
  4. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    И не говорите. Ну или попробуйте обойти кавычки. Они есть.

    ТС:

    Это делается без всяких скриптов на уровне СУБД.

    Варианты INSERT IGNORE... или ON DUPLICATE KEY UPDATE. Но второй вариант сложнее, поскольку кей должен быть unique. Боюсь что в рамках вашего прелестного фреймворка не светит ни один.

    Код (Text):
    1. if(!isset($result)){
    Оно всегда isset. В случае облома is set to false, в случае успеха - true. Что не свидетельствует об отсутствии записей, а только показывает как прошел сам запрос. Чтобы проверить сколько записей пришло - см выше.

    Добавлено спустя 4 минуты 35 секунд:
    А, да, там же опять этот милый класс. Короче, вам надо узнать где у него кнопка - которая вернет количество записей.

    Это просто потрясающе как народ умудряется бегать за какими-то чудесными обхектами, изучение и запоминание свойств и методов которых заменяет изучение и запоминание свойств и методов первоисточника.
     
  5. [pandora]

    [pandora] Активный пользователь

    С нами с:
    18 сен 2012
    Сообщения:
    71
    Симпатии:
    1
    Your, спасибо, я поняла, вы как всегда мне помогли, дав короткий, но информативный ответ =)
    deblogger, много информации, заставили задуматься, почитать про INSERT IGNORE и ON DUPLICATE KEY UPDATE, в целом тоже полезно, благодарю.
    igordata справедливое замечание, буду думать.

    Добавлено спустя 12 минут 1 секунду:
    igordata Хотя нет, чего это я... Не справедливое и думать я не буду, у меня проверка происходит в пхп.
    Код (Text):
    1.  
    2. public function preString($str, $specchars=0, $del_bad_ascii=1, $slashes=1) {
    3.         if (!empty($str)) {
    4.             if (get_magic_quotes_gpc()) $str = stripslashes($str);
    5.  
    6.             if ($specchars) $str = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
    7.            
    8.             if (!is_int($str) && $slashes) $str = str_replace(array("'"), array("\'"), $str);
    9.            
    10.             if ($del_bad_ascii) {
    11.                 $str = str_replace(array("\r\n", "\r", "\n", "\t"), ' ', $str);
    12.                 $str = trim($str);
    13.             }
    14.             return $str;
    15.         }
    16.     }

    Код (Text):
    1.     public function addMovie() {
    2.         global $db_pre, $lang_admin, $allowed_extensions, $time, $lang_id, $hash;
    3.  
    4.         $this->checkCSRF();
    5.         $text_fields = array('descr');
    6.        
    7.         foreach ($text_fields as $field_name) {
    8.             $value[$field_name] = $this->utils->unescapeTagInnerHTML($_POST[$field_name]);
    9.             $value[$field_name] = $this->utils->preString($value[$field_name], false, false);
    10.             $value[$field_name] = ((substr($value[$field_name], -6)=='<br />')? substr($value[$field_name], 0, -6): $value[$field_name]);
    11.         }
    12.          
    13.         if (empty($_POST['original_title'])) {
    14.             $error[] = $lang_admin['name_err'];
    15.         } else {
    16.             $value['original_title'] = $this->utils->preString($_POST['original_title'], true);
    17.         }
    18.         $value['ru_title'] = $this->utils->preString($_POST['ru_title'], true);
    19.         $value['en_title'] = $this->utils->preString($_POST['en_title'], true);
    20.         $value['az_title'] = $this->utils->preString($_POST['az_title'], true);
    21.         if (empty($_POST['descr'])) {$error[] = $lang_admin['short_err'];}
    22.         $value['link'] = $this->utils->preString($_POST['link'], true);
    23.         $value['three_d'] = (empty($_POST['three_d'])? '0': '1');
    24.         if (!is_array($_POST['cid']) || !$this->utils->checkId($_POST['cid'])) $error[] = $lang_admin['cid_err'];
    25.         else $value['cid'] = $_POST['cid'];
    26.         $value['show_date'] = strtotime($_POST['show_date']);
    27.         $value['movie_year'] = $this->utils->preString($_POST['movie_year'], true);
    28.         $value['az_country'] = strtotime($_POST['az_country']);
    29.         $value['ru_country'] = strtotime($_POST['ru_country']);
    30.         $value['usa_country'] = strtotime($_POST['usa_country']);
    31.         $value['status'] = (empty($_POST['status'])? '0': '1');
    32.         $value['ordering'] = $this->maxValue($db_pre.'movie')+1;
    33.         $value['add_by'] = $_SESSION[$hash]['sess_id'];
    34.         $value['add_date'] = $time;
    35.        
    36.        
    37.    
    38.    
    39.    
    40.    
    41.         if (is_array(@$error)) {
    42.             $this->utils->showNotice('error', $error);
    43.             $value['error'] = true;
    44.             return $value;
    45.         } else {
    46.             foreach ($_FILES as $input=>$file) {
    47.                 if (!empty($file['name'])) {
    48.                     $value[$input] = $this->utils->fileUpload($_FILES[$input]['name'], $_FILES[$input]['tmp_name'], '../'.$this->upload.'/category/thumbs', $allowed_extensions['images'], 'move');
    49.                 }
    50.             }
    51.            
    52.            
    53.         foreach ($value as $f => $v) {
    54.             if (!in_array($f, array('cid'))) {
    55.                 if (!empty($fields)) {
    56.                     $fields.=',';
    57.                     $values.=',';
    58.                 }
    59.                     $fields.='`'.$f.'`';
    60.                     $values.=(($v==='NULL')? $v: "'$v'");
    61.             }
    62.         }
    63.        
    64.         //
    65.             $id = $this->admin->sqlInsert($db_pre.'movie', $fields, $values);
    66.            
    67.             if ($id) {
    68.                 $cats_num = count($value['cid']);
    69.                 for ($i=0; $i<$cats_num; $i++) {
    70.                     $add_arr[] = $value['cid'][$i].','.$id;
    71.                 }
    72.         //
    73.                 $this->admin->sqlInsert($db_pre.'category_article', '', $add_arr);
    74.                
    75.                
    76.               /*
    77.                                                             сижу на работе и мне так хреново,
    78.                                                             пытаюсь писать, всё это не ново,
    79.                                                             к тому же коллеги с работы съебали,
    80.                                                             останусь одна, упорюсь я грибами
    81.                                                            
    82.                                                             */  
    83.                
    84.                 /* ACTORS*/
    85.                
    86.                
    87.     $mystring = $_POST['actors'];
    88.     $findme   = ',';
    89.     $pos = strpos($mystring, $findme);
    90.  
    91.     if ($pos === false) {
    92.        
    93.         if(!empty($_POST['actors'])) {
    94.             $res=$this->admin->sqlSelect('*', $db_pre.'actors', "name='{$_POST['actors']}'", '', 0, 1);
    95.             if(!mysql_num_rows($res)){
    96.                 $id_act = $this->admin->sqlInsert($db_pre.'actors', 'name', "'{$_POST['actors']}'");
    97.                 $this->admin->sqlInsert($db_pre.'bunch_movie', 'mid, act_id, type', "'{$id}', '{$id_act}', 'actor'");
    98.             }
    99.         }
    100.        
    101.     } else {
    102.         $str = $_POST['actors'];
    103.         $actors_array = explode(',', $str);
    104.        
    105.         foreach ($actors_array as $key => $value){
    106.             if(!empty($value)) {
    107.                     $res=$this->admin->sqlSelect('*', $db_pre.'actors', "name='{$value}'", '', 0, 1);
    108.                     if(!mysql_num_rows($res)){
    109.                         $id_act = $this->admin->sqlInsert($db_pre.'actors', 'name', "'{$value}'");
    110.                         $this->admin->sqlInsert($db_pre.'bunch_movie', 'mid, act_id, type', "'{$id}', '{$id_act}', 'actor'");
    111.                     }
    112.             }
    113.         }
    114.     }
    115.    
    116.    
    117.    
    118.                                     /* DIRECTOR*/
    119.    
    120.         $mystring_dir = $_POST['director'];
    121.     $findme_dir = ',';
    122.     $pos_dir = strpos($mystring_dir, $findme_dir);
    123.  
    124.     if ($pos_dir === false) {
    125.        
    126.         if(!empty($_POST['director'])) {
    127.             $res=$this->admin->sqlSelect('*', $db_pre.'actors', "name='{$_POST['director']}'", '', 0, 1);
    128.             if(!mysql_num_rows($res)){
    129.                 $id_act = $this->admin->sqlInsert($db_pre.'actors', 'name', "'{$_POST['director']}'");
    130.                 $this->admin->sqlInsert($db_pre.'bunch_movie', 'mid, act_id, type', "'{$id}', '{$id_act}', 'director'");
    131.             }
    132.         }
    133.        
    134.     } else {
    135.         $str = $_POST['director'];
    136.         $actors_array = explode(',', $str);
    137.        
    138.         foreach ($actors_array as $key => $value){
    139.             if(!empty($value)) {
    140.                     $res=$this->admin->sqlSelect('*', $db_pre.'actors', "name='{$value}'", '', 0, 1);
    141.                     if(!mysql_num_rows($res)){
    142.                         $id_act = $this->admin->sqlInsert($db_pre.'actors', 'name', "'{$value}'");
    143.                         $this->admin->sqlInsert($db_pre.'bunch_movie', 'mid, act_id, type', "'{$id}', '{$id_act}', 'director'");
    144.                     }
    145.             }
    146.         }
    147.     }
    148.            
    149.                
    150.    
    151.                 $this->addToSearch('a', $lang_id[$this->deflang], $id, $value['title'].' '.$value['descr'], $value['status'], $value['show_date']);
    152.                 $this->utils->showNotice('success', $lang_admin['add_suc']);
    153.             //  $this->utils->redirect('?action=edit_movie&'.time());
    154.                
    155.                
    156.                 print_r($actors_array);
    157.                
    158.             } else {
    159.                 return false;
    160.             }
    161.         }
    162.     }
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    где? не вижу. код ниже не проверка и не спасение.
     
  7. [pandora]

    [pandora] Активный пользователь

    С нами с:
    18 сен 2012
    Сообщения:
    71
    Симпатии:
    1
    Пост обрабатывается функцией preString(), разве не достаточно? Нет, ну может я конечно и не права, я только начинаю...
     
  8. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Ой ну я прям нимагу :) у тебя талант к поэзии.Не обращай внимание на этих программистов:) Девушка а что вы скажете если я приглашу вас на чашечку кофе:)

    По теме: нет не достаточно:)
     
  9. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    [pandora], еще такой вопрос зачем вы используете ООП и GLOBAL ?
    Вижу как хочется тебе программировать, но ты не успела освоиться-это нормально, умница, что познаешь функционал, только вот нужно использовать его разумнее, в практике ты научишься, но не сразу, так не бывает.)
    Но советую лишнего не выдумывать, а понять более глубже реализацию.
    И не писать ничего непригодного.
    Внимательно изучить обработку строк при записи в базу данных и вывода из нее.
     
  10. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    А теперь серьезно:
    Почитай здесь php.net/manual/ru/function.get-magic-quotes-gpc.php в частности список изменений.

    Скажи откуда этот код? Обычно маг. кавычки отключают что бы не мешали и разрабатывают приложение.Для защиты от sql injection используется mysql_real_escape_string или ей подобные в зависимости от используемого интерфейса.

    Что это? :)

    Про глобалс Your написал...

    Добавлено спустя 9 минут 20 секунд:
    Мда... как насчет кофе? :)
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    кофе с грибами
     
  12. vayas

    vayas Активный пользователь

    С нами с:
    13 дек 2012
    Сообщения:
    167
    Симпатии:
    9
    Адрес:
    Пермь
    Жжошь )))))