PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (1): [1]

> Найдено сообщений: 5
Daytona Отправлено: 21 Июня, 2012 - 14:48:21 • Тема: REPLACE INTO не работает • Форум: Работа с СУБД

Ответов: 0
Просмотров: 4729
Задача: записать в таблицу значения форм. Если форма с таким именем есть, то обновить значение, если нет - вставить. Как я понял, для этих целей и создан REPLACE. Вот пример кода, которые вставляет значения:
PHP:
скопировать код в буфер обмена
  1. $id_model = $_POST['modelID'];
  2.     mysql_query('SET AUTOCOMMIT=0'); // начало глобальной транзакции
  3.     mysql_query('START TRANSACTION');
  4.     foreach ($_POST as $k => $v) {
  5.         $query = "REPLACE INTO avto.param
  6.                                 VALUES (
  7.                                         '$id_model', (SELECT id_param
  8.                                                 FROM param_spr
  9.                                                 WHERE name_param = '$k'),
  10.                                         '$v', (SELECT id_group
  11.                                                 FROM param_spr
  12.                                                 WHERE name_param = '$k')
  13.                                 )";
  14.                 $q = mysql_query($query);
  15.                 if(!$q) {
  16.                   echo("Bad query from replace old parameter ($k): ". mysql_error());
  17.                   mysql_query('ROLLBACK');
  18.                   exit();
  19.                 } else {
  20.                 $r = mysql_num_rows($q); var_dump($r);
  21.                 }
  22.         var_dump($query);
  23.           }
  24.         }


Структура таблицы:
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE `param` (
  2.  `id_model` varchar(20) CHARACTER SET utf8 NOT NULL,
  3.  `id_param` varchar(30) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  4.  `value` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  5.  `id_group` tinyint(2) DEFAULT NULL,
  6.  PRIMARY KEY (`id_model`,`id_param`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci


Apache/2.2.17 (Ubuntu)
Версия MySQL-клиента: 5.1.62
phpMyAdmin : 3.3.10deb1

Предварительная проверка и обезопасивание значений проводятся перед этим. Финальный COMMIT идет дальше. Два подзапроса выбирают id из таблицы-справочника, чтобы записать именно его в таблицу, а не строку имени поля формы. set charset utf8 также в начале делается. Чтобы иметь возможность увидеть текст запроса, я его засунул в $query. Итак, на экран возвращается серия запросов типа
PHP:
скопировать код в буфер обмена
  1. NULL
  2. string(284) "REPLACE INTO avto.param
  3. VALUES (
  4.                 'pc6', (SELECT id_param
  5.                         FROM param_spr
  6.                         WHERE name_param = 'assembly'),
  7.                 'Australia', (SELECT id_group
  8.                                 FROM param_spr
  9.                                 WHERE name_param = 'assembly')
  10. )"

А точнее - сначала количество строк в результате - почему-то NULL, и сам дамп строки запроса. Ошибок не возникает, но значения в таблицу не вставляются и не меняются. Пробовал менять запрос на
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO avto.param
  2. VALUES (
  3.                 'pc6', (SELECT id_param
  4.                         FROM param_spr
  5.                         WHERE name_param = 'assembly'),
  6.                 'Australia', (SELECT id_group
  7.                                 FROM param_spr
  8.                                 WHERE name_param = 'assembly')
  9. ) ON DUPLICATE KEY UPDATE value = 'Australia'


но результат тот же. Что самое интересное - если выполнить этот же запрос в phpmyadmin, то все прекрасно работает. У меня куча других запросов с подзапросами, так что врятли это дело в подзапросах. Кавычек, сложных выражений со скобками тоже нет - только минимум кавычек. Опять-таки, есть другие запросы, которые работают без косых кавычек``. Пробовал проверить, может я чего-то перемудрил с обработкой ошибок и она просто не работает? Нет, если REPLACE заменить на INSERT (синтаксис абсолютно одинаковый), то сразу же выскакивает ошибка о существовании уже такого уникального ключа, так что явной ошибки в запросе нет.

Итого:
1. Запрос теоретически рабочий, я его вижу на экране и привел сюда. NULL как результат mysql_num_rows настораживает.
2. В эту ветку кода действие попадает, иначе я бы не видел запросов. mysql_error также работает
3. Наконец, phpmyadmin запрос выполняет правильно, скрипт - нет, но и ошибок нет.

Помогите, пожалуйста.
Daytona Отправлено: 20 Января, 2012 - 14:34:21 • Тема: Как подключить скрипт загрузки изображений? • Форум: Вопросы новичков

Ответов: 5
Просмотров: 278
Кое-что поменял, теперь структура выглядит так:

файл с функциями


основной файл
PHP:
скопировать код в буфер обмена
  1. Общие переменные
  2. Подключение файла с функциями
  3. if .... // загрузка изображения
  4.     {
  5.          Подключение файла
  6.          Использование общих функций из файла с функциями
  7.          Результат 1
  8.     }
  9. if ... // генерирование таблицы
  10.    {
  11.        Использование общих функций из файла с функциями
  12.        Помещение загруженного изображения в ячейку таблицы
  13.        Результат 2
  14.     }
  15.  


Казалось бы, такой код должен работать так, как задумано. Однако решились только 2 второстепенные проблемы:
1) теперь опять нормально работает суперглобальный массив $_FILES и нет нужды использовать массивы-посредники
2) разбитие файлов на несколько мелких положительно сказалось на мобильности и удобстве работы

2 другие важные проблемы не решены:
1) работает только половина кода - в зависимости от нажатой кнопки. "Гениальный" перенос загрузки изображения в начало кода (действительно, чтобы таблица смогла отобразить изображение, он вначале должен быть загружен) ничего не дал - переменная, хранящая имя картинки, создается только при загрузке изображения.
2) Возможности последовательной загрузки нескольких изображений нет (её конечно можно реализовать, используя несколько форм загрузки, но мне надо, чтобы изображений загружалось столько, сколько нужно, и последовательно, а не все сразу) - при загрузке нового изображения оно как бы вытесняет старое (а точнее, заменяется новым значением). Ухищрения вида
PHP:
скопировать код в буфер обмена
  1.  $img_counter = 0;
  2. if (isset($_POST['upload']))
  3. {
  4.     $img_counter++;
  5. for ($i = 0; $i < $img_counter; $i++)
  6.         {
  7.                  //echo $img_arr_s[$i];
  8.                 echo "\n\t\t<img src=\"img/".$img_arr_s[$i]."\">";
  9.          }

ни к чему не приводят - счетчик все время стоит на единице.

Тут-то я вспомнил про http://phpfaq[dot]ru/na_tanke Радость и понял, что эти проблемы перетекают уже в другую плоскость. Подскажите, пожалуйста, на какие конкретно моменты (главы, статьи) в javascript обратить внимание, чтобы решить эту задачу.
Daytona Отправлено: 20 Января, 2012 - 11:35:46 • Тема: Как подключить скрипт загрузки изображений? • Форум: Вопросы новичков

Ответов: 5
Просмотров: 278
Zuldek пишет:
$_FILES передавать не нужно это супер-глобальный массив работайте с ним напрямую с любого скрипта.


В том-то и дело, что в подключаемом скрипте этот массив пустой. Решил эту проблему в главном файле так:
PHP:
скопировать код в буфер обмена
  1. if (isset($_POST['upload']))
  2.                     {
  3.                         foreach ($_FILES['uploadfile'] as $k => $v)
  4.                         {
  5.                             $files[$k] = $v;
  6.                             //echo "<br>".$files[$k];
  7.                         }
  8.                         include("img_upload.php");
  9.                     }


Теперь там все работает от созданного массива.

Zuldek пишет:
вообще решать надо начинать с просмотра лога ошибок сервера, если вывод ошибок запрещен. Ещё поставьте проверки после каждого действия скрипта если не пользуетесь отладчиком


Я вывод ошибок включил в начале файла. Иногда и вывод варнингов и нотисов включаю, если они не сильно мешают. Во всех критических местах у меня такие проверки стоят. Просто основной код - это различные расчеты и преобразования, поэтому, когда какая-нибудь переменная пустая, я вижу нотис или варнинг. В подключенном скрипте я видел варнинг о том, что ф-я getimagesize() не сработала из-за пустой переменной, к-й как раз был суперглобальный массив $_FILES


Попытался максимально обобщить схему работы главного скрипта и вот, что вышло:

PHP:
скопировать код в буфер обмена
  1. Общие функции
  2. Общие переменные
  3. if ...    // Вывод сгенерированной таблицы
  4.        {
  5.              Вызов общих функций
  6.              Расчеты 1
  7.               Результаты расчетов 1
  8.         }
  9.  
  10. if ... // Подключение файла загрузки картинок
  11.        {
  12.               Подключение файла
  13.               Вызов локальных функций файла
  14.               Расчеты 2 в подключенном файле
  15.               Результаты расчетов 2
  16.         }


После этого понял, что все функции лучше делать общими и держать отдельно от самого файла (так он меньше строчек занимает, когда их около тысячи, крутить мышкой вверх-вниз не очень удобно). А вот как сделать так, чтобы результаты расчетов были тоже доступны "глобально"? Получается так, что у меня либо одна часть скрипта работает, либо другая и результаты одной части недоступны для другой
Daytona Отправлено: 20 Января, 2012 - 08:20:56 • Тема: Как подключить скрипт загрузки изображений? • Форум: Вопросы новичков

Ответов: 5
Просмотров: 278
Нет, у меня нет классов нигде
Daytona Отправлено: 19 Января, 2012 - 18:39:17 • Тема: Как подключить скрипт загрузки изображений? • Форум: Вопросы новичков

Ответов: 5
Просмотров: 278
Здравствуйте! У меня такая проблема: я пишу один довольно большой скрипт на PHP, и тут дошла очередь до загрузки изображений. Её я решил написать в отдельном файле, чтобы потом подключить к первому, большому. Да и от большого не мешало бы отделить функции в отдельные файлы.

Оба скрипта по отдельности работают. Загрузчик изображений перехватывает как ошибки $_FILES['uploadfile']['error'], is_upload_file(), так и проверяет размеры картинки и т.д. И выдает на экран оригинал + 2 картинки меньших размеров.

Большой скрипт представляет собой обработчик форм: строит таблицу типа Параметр - Значение, в некоторых случаях лазя в БД, для проверки "а нет ли уже таких введенных значений". Ну, да это не важно. Таблица выводится с помощью PHP, срабатывая на нажатие кнопки.

Вот общая структура файлов:
img_upload.php
PHP:
скопировать код в буфер обмена
  1. <form  method="post" action="img_upload.php" enctype="multipart/form-data">
  2.     <input type="file" name="uploadfile">
  3.     <input type="submit" name="upload" value="Upload image">
  4. </form>
  5. <?PHP
  6. /f (isset($_POST['upload'])) // При нажатии кнопки идет загрузка и т.п.
  7. {
  8.            $file_old_name = $_FILES['uploadfile']['name']; // Имя загружаемого файла
  9.            // Ну и далее в том же духе: переменные, функции, проверки...
  10.            // если все проверки пройдены успешно и все отработало, то выведется
  11.             echo "<img src=\"/img/".basename($v)."\">\n";
  12.             // т.е. html-ная картинка. Ну и впоследствии сделаю, чтобы в главный файл некоторые переменные передавались
  13. }
  14. ?>


form.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. if (isset($_POST['preview'])) // При нажатии на Превью генерируется таблица, предварительно проверяется корректность введенных данных
  4. {
  5.        // И опять проверки, функции....
  6.       // Пошла сгенерированная таблица:
  7.        ?>
  8.     <table border="1" bordercolor="lightgrey" align="center" width="60%">
  9.         <tr align="left">
  10.             <td>
  11.              .....
  12.             // В конце таблицы выводится кнопочка, при нажатии которой все данные уплывут в БД
  13.             <form name="commit" id="add" method="post" action="commit.php">
  14.                     <br><input type="submit" name="add" form="add" value="Add">
  15.                 </form>
  16.             </td>
  17.         </tr>
  18.     </table>
  19. Далее идет та таблица, которая выводится в любом случае - в ней выводятся формы для заполнения
  20.  
  21. <form method="POST">
  22. <fieldset>
  23.     <legend><h4>General info</h4></legend>
  24.     <table cellspacing="0" cellpadding="5" border="0" bordercolor="lightgrey" width="100%">
  25.      ......
  26.      </table>
  27.     </fieldset>    
  28.     <p><input type="submit" name="preview" value="Preview">
  29. </form>
  30. </body>
  31. </html>
  32.  


Кроме главного вопроса - почему не работает include/require?, возникают еще несколько:
  • Я поместил <input>ы в конец таблицы и связал их по id с формой, попутно перенеся форму загрузки из скрипта загрузки в общий файл, а там её закомментирвал:
    PHP:
    скопировать код в буфер обмена
    1.  
    2.  <td>
    3.                
    4.                     <input type="file" name="uploadfile" form="img_upload">
    5.                     <input type="submit" name="upload" value="Upload image" form="img_upload">
    6.                
    7.                 <?PHP
    8.                     if (isset($_POST['upload']))
    9.                     {
    10.                         echo "<br>".$_FILES['upload'];
    11.                         $upl = $_FILES['uploadfile'];
    12.                         include("img_upload.php");
    13.                     }
    14.                 ?>
    15.             </td>
    16.         </tr>
    17.     </table>
    18.     </fieldset>
    19.     <p><input type="submit" name="preview" value="Preview">
    20. </form>
    21. <form  method="post" id="img_upload" enctype="multipart/form-data">
    22.  


    В это случае данная проверка почему-то работает и выводит мне мое сообщение о том, что выбранный файл не является изображением (потому что его ширина пустая), хотя я еще ничего не нажимал. Т.е. при загрузке страницы почему-то в любом случае отрабатывается условие и скрипт выполняется, хотя, если посмотреть выше и увидеть такое же условие в двух вышеприведенных файлах, то там без нажатия ничего не делалось. Попытки все-таки выбрать картинку и загрузить её ничего не меняют. Обычные переменные подключенный файл видит, а массив $_FILES, который надо передать - нет, разве что он передан через $var1 = $_FILES['uploadfile']['tmp_name'], $var2 = $_FILES['uploadfile']['name'] и т.д. Это же неудобно! Я конечно, могу создать цикл, переливающий из этого массива в мой, а потом свой передать, но разве это единственный способ? Просто $var = $_FILES['uploadfile'] не работает. Можно как-то решить передачу этого суперглобального массива? Если запрашивать его в подключаемом скрипте, то он снова будет пустым, независимо от того, в каком скрипте находилвась форма.

  1. Как передавать $_FILES подключаемому скрипту (или наоборот)?
  2. Куда в скрипте вставить эту форму и подключение? И как правильно сделать вызов файла?
  3. Почему когда я жму на кнопку загрузки фото, моя сгенерированная таблица пропадает (и наоборот)? Как это решить?

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB