Задача: записать в таблицу значения форм. Если форма с таким именем есть, то обновить значение, если нет - вставить. Как я понял, для этих целей и создан REPLACE. Вот пример кода, которые вставляет значения:
Apache/2.2.17 (Ubuntu)
Версия MySQL-клиента: 5.1.62
phpMyAdmin : 3.3.10deb1
Предварительная проверка и обезопасивание значений проводятся перед этим. Финальный COMMIT идет дальше. Два подзапроса выбирают id из таблицы-справочника, чтобы записать именно его в таблицу, а не строку имени поля формы. set charset utf8 также в начале делается. Чтобы иметь возможность увидеть текст запроса, я его засунул в $query. Итак, на экран возвращается серия запросов типа
А точнее - сначала количество строк в результате - почему-то NULL, и сам дамп строки запроса. Ошибок не возникает, но значения в таблицу не вставляются и не меняются. Пробовал менять запрос на
но результат тот же. Что самое интересное - если выполнить этот же запрос в phpmyadmin, то все прекрасно работает. У меня куча других запросов с подзапросами, так что врятли это дело в подзапросах. Кавычек, сложных выражений со скобками тоже нет - только минимум кавычек. Опять-таки, есть другие запросы, которые работают без косых кавычек``. Пробовал проверить, может я чего-то перемудрил с обработкой ошибок и она просто не работает? Нет, если REPLACE заменить на INSERT (синтаксис абсолютно одинаковый), то сразу же выскакивает ошибка о существовании уже такого уникального ключа, так что явной ошибки в запросе нет.
Итого:
1. Запрос теоретически рабочий, я его вижу на экране и привел сюда. NULL как результат mysql_num_rows настораживает.
2. В эту ветку кода действие попадает, иначе я бы не видел запросов. mysql_error также работает
3. Наконец, phpmyadmin запрос выполняет правильно, скрипт - нет, но и ошибок нет.
Помещение загруженного изображения в ячейку таблицы
Результат 2
}
Казалось бы, такой код должен работать так, как задумано. Однако решились только 2 второстепенные проблемы:
1) теперь опять нормально работает суперглобальный массив $_FILES и нет нужды использовать массивы-посредники
2) разбитие файлов на несколько мелких положительно сказалось на мобильности и удобстве работы
2 другие важные проблемы не решены:
1) работает только половина кода - в зависимости от нажатой кнопки. "Гениальный" перенос загрузки изображения в начало кода (действительно, чтобы таблица смогла отобразить изображение, он вначале должен быть загружен) ничего не дал - переменная, хранящая имя картинки, создается только при загрузке изображения.
2) Возможности последовательной загрузки нескольких изображений нет (её конечно можно реализовать, используя несколько форм загрузки, но мне надо, чтобы изображений загружалось столько, сколько нужно, и последовательно, а не все сразу) - при загрузке нового изображения оно как бы вытесняет старое (а точнее, заменяется новым значением). Ухищрения вида
ни к чему не приводят - счетчик все время стоит на единице.
Тут-то я вспомнил про http://phpfaq[dot]ru/na_tanke и понял, что эти проблемы перетекают уже в другую плоскость. Подскажите, пожалуйста, на какие конкретно моменты (главы, статьи) в javascript обратить внимание, чтобы решить эту задачу.
вообще решать надо начинать с просмотра лога ошибок сервера, если вывод ошибок запрещен. Ещё поставьте проверки после каждого действия скрипта если не пользуетесь отладчиком
Я вывод ошибок включил в начале файла. Иногда и вывод варнингов и нотисов включаю, если они не сильно мешают. Во всех критических местах у меня такие проверки стоят. Просто основной код - это различные расчеты и преобразования, поэтому, когда какая-нибудь переменная пустая, я вижу нотис или варнинг. В подключенном скрипте я видел варнинг о том, что ф-я getimagesize() не сработала из-за пустой переменной, к-й как раз был суперглобальный массив $_FILES
Попытался максимально обобщить схему работы главного скрипта и вот, что вышло:
После этого понял, что все функции лучше делать общими и держать отдельно от самого файла (так он меньше строчек занимает, когда их около тысячи, крутить мышкой вверх-вниз не очень удобно). А вот как сделать так, чтобы результаты расчетов были тоже доступны "глобально"? Получается так, что у меня либо одна часть скрипта работает, либо другая и результаты одной части недоступны для другой
Здравствуйте! У меня такая проблема: я пишу один довольно большой скрипт на PHP, и тут дошла очередь до загрузки изображений. Её я решил написать в отдельном файле, чтобы потом подключить к первому, большому. Да и от большого не мешало бы отделить функции в отдельные файлы.
Оба скрипта по отдельности работают. Загрузчик изображений перехватывает как ошибки $_FILES['uploadfile']['error'], is_upload_file(), так и проверяет размеры картинки и т.д. И выдает на экран оригинал + 2 картинки меньших размеров.
Большой скрипт представляет собой обработчик форм: строит таблицу типа Параметр - Значение, в некоторых случаях лазя в БД, для проверки "а нет ли уже таких введенных значений". Ну, да это не важно. Таблица выводится с помощью PHP, срабатывая на нажатие кнопки.
Кроме главного вопроса - почему не работает include/require?, возникают еще несколько:
Я поместил <input>ы в конец таблицы и связал их по id с формой, попутно перенеся форму загрузки из скрипта загрузки в общий файл, а там её закомментирвал:
В это случае данная проверка почему-то работает и выводит мне мое сообщение о том, что выбранный файл не является изображением (потому что его ширина пустая), хотя я еще ничего не нажимал. Т.е. при загрузке страницы почему-то в любом случае отрабатывается условие и скрипт выполняется, хотя, если посмотреть выше и увидеть такое же условие в двух вышеприведенных файлах, то там без нажатия ничего не делалось. Попытки все-таки выбрать картинку и загрузить её ничего не меняют. Обычные переменные подключенный файл видит, а массив $_FILES, который надо передать - нет, разве что он передан через $var1 = $_FILES['uploadfile']['tmp_name'], $var2 = $_FILES['uploadfile']['name'] и т.д. Это же неудобно! Я конечно, могу создать цикл, переливающий из этого массива в мой, а потом свой передать, но разве это единственный способ? Просто $var = $_FILES['uploadfile'] не работает. Можно как-то решить передачу этого суперглобального массива? Если запрашивать его в подключаемом скрипте, то он снова будет пустым, независимо от того, в каком скрипте находилвась форма.
Как передавать $_FILES подключаемому скрипту (или наоборот)?
Куда в скрипте вставить эту форму и подключение? И как правильно сделать вызов файла?
Почему когда я жму на кнопку загрузки фото, моя сгенерированная таблица пропадает (и наоборот)? Как это решить?