Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос перестал работать / 18 сообщений из 18, страница 1 из 1
09.08.2017, 00:36
    #39502238
sserebann
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
$DataNaborki = $_POST['DataNaborki']; //Дата формата '2017-08-08' - это поле даты
$smena = $_POST['Smena']; // '1 смена' - это текстовое поле
$file_name = $data_filename; // 'Naborki/20170808_1.htm' - то путь к файлу на сервере

$link = mysqli_connect($host, $user, $password, "w95595it_razm")
or die("Ошибка " . mysqli_error($link));

//Удалить строку со старой наборкой
$query ="DELETE FROM Naborki WHERE Date='".$DataNaborki."' AND Smena='".$smena."'";

$result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));
$query ="INSERT INTO Naborki (Date, Smena, File) VALUES ('".$DataNaborki."', '".$smena."', '".$file_name."')";
$result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));

После выполнения запроса существующую запись не удаляет, а добавляет запись в которой поля Date и File отображены корректно, а Smena указано '1' вместо '1 смена'
...
Рейтинг: 0 / 0
09.08.2017, 00:47
    #39502239
sserebann
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
Код работал когда я передавал параметры через GET запрос а файл через FTP, потом я передалал код под POST запрос, файл на сервер приходит, все переменные при помощи echo получаю корректно, а в базе так как на скриншоте
...
Рейтинг: 0 / 0
09.08.2017, 00:55
    #39502240
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
sserebannЗапрос перестал работатьЧто произошло 3-4 августа? Изменялись ли какие-то настройки сервера, скрипты, структура таблиц?


sserebannсуществующую запись не удаляет, а добавляет запись в которой поля Date и File отображены корректно, а Smena указано '1' вместо '1 смена'
Код: sql
1.
var_dump($query);

два раза для начала. Показывайте тексты запросов здесь вместе с DDL таблицы.
...
Рейтинг: 0 / 0
09.08.2017, 00:59
    #39502241
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
Да, и ещё почему-то в Вашем коде отсутствует SET NAMES.
...
Рейтинг: 0 / 0
09.08.2017, 01:03
    #39502243
sserebann
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
vkle,

string(63) "DELETE FROM Naborki WHERE Date='2017-08-04' AND Smena='1 смена'"¶
string(98) "INSERT INTO Naborki (Date, Smena, File) VALUES ('2017-08-04', '1 смена', 'Naborki/20170804_1.htm')"¶
...
Рейтинг: 0 / 0
09.08.2017, 01:09
    #39502244
sserebann
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
vkle,

3-4 августа ничего не менялось, все изменения произвел сегодня. Я передавал параметры через GET запрос а файл через FTP (все работало), потом я передалал код под POST запрос и вот что получилось.
...
Рейтинг: 0 / 0
09.08.2017, 01:17
    #39502245
sserebann
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
vkle,

Это полный код скрипта

<?
$submit = ( isset($_POST['submit']) ) ? intval($_POST['submit']) : 0;

$some_field = ( isset($_POST['some_field']) ) ? htmlspecialchars($_POST['some_field']) : '';

if ( !empty($submit) )
{
//Здесь работаем с содержимым переданного файла.
$uploadFile = $_FILES['data'];
$tmp_name = $uploadFile['tmp_name'];
if ( !is_uploaded_file($tmp_name) )
{
die('Ошибка при загрузке файла');
}
else
{

//Считываем файл в строку
$data = file_get_contents($tmp_name);
//Декодируем данные
$data = base64_decode($data);
//Теперь нормальный файл можно сохранить на диске
$data_filename = 'Naborki/'.$_FILES['data']['name'];
if ( !empty($data) && ($fp = @fopen($data_filename, 'wb')) )
{
@fwrite($fp, $data);
@fclose($fp);


//добавление записи в базу SQL
$DataNaborki = $_POST['DataNaborki'];
$smena = $_POST['Smena'];
$file_name = $data_filename;

//подключение к базе
$host = 'localhost';
$user = 'w95595it_razm';
$password = 'gvlkKAQHz7KX40PkAl';
$database = 'w95595it_razm';
$link = mysqli_connect($host, $user, $password, "w95595it_razm")
or die("Ошибка " . mysqli_error($link));

mysql_query("SET NAMES 'cp1251'");
mysql_query("SET CHARACTER SET 'cp1251'");

//Удалить строку со старой наборкой
$query ="DELETE FROM Naborki WHERE Date='".$DataNaborki."' AND Smena='".$smena."'";
var_dump($query);

$result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));
$query ="INSERT INTO Naborki (Date, Smena, File) VALUES ('".$DataNaborki."', '".$smena."', '".$file_name."')";
var_dump($query);
$result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));

//очищаем результат
mysqli_free_result($result);


mysqli_close($link);




}
unset($data);


}
}

?>
...
Рейтинг: 0 / 0
09.08.2017, 01:22
    #39502246
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
sserebann,

Запросы сами по себе корректны. Однако, если верить Вашей картинке, проблема произошла после строки с id=50, которая характеризуется как раз 4 августа. Строка с id=50 содержит "1 смена", а в строке с id=51 за ту же дату - уже "1".


sserebann$link = mysql i _connect
sserebannmysql_query("SET NAMES 'cp1251'");Внимательнее печатайте буквы в именах функций!
...
Рейтинг: 0 / 0
09.08.2017, 01:27
    #39502248
sserebann
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
vkle,

после строки с id 50 я скопировал код из рабочего скрипта с GET запросом в файл скрипта с POST запросом
...
Рейтинг: 0 / 0
09.08.2017, 02:23
    #39502249
sserebann
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
vkle,

Спасибо за помощь.
...
Рейтинг: 0 / 0
09.08.2017, 15:48
    #39502703
sserebann
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
Проблема не решена. Может ошибка в настройках таблицы?
...
Рейтинг: 0 / 0
09.08.2017, 16:57
    #39502773
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
Может. Но Вы же не желаете показать DDL проблемной таблицы.
...
Рейтинг: 0 / 0
09.08.2017, 17:20
    #39502791
sserebann
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
vkle,

Это DDL?
...
Рейтинг: 0 / 0
09.08.2017, 17:34
    #39502805
sserebann
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
Данные я передаю из 1с может там проблема?

Это код из 1с

Процедура ОтправитьФайлНаСервер(ИмяФайл, ПутьИИмя, ДатаНаборки, Смена) Экспорт
//Подготовка переменных
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
//Определяем имя файла ответа от веб-сервера
ИмяФайлаОтвета = КаталогВременныхФайлов() + "answer.tmp";
//Какой-то ранее созданный архив
ИмяФайлаДанных = ПутьИИмя; //ЭТО МОЙ ФАЙЛ "data.zip"
//Закодируем содержимое файла по Base64, то есть преобразуем его к URL-неактивному виду.
СодержимоеZIP = Base64Строка(Новый ДвоичныеДанные(ИмяФайлаДанных));
//Проверим размер кодированного файла.
ДопустимыйРазмерФайлаВБайтах = 2097152; // это 2Мб (1Мб = 1048576 байт)
Если СтрДлина(СодержимоеZIP) > ДопустимыйРазмерФайлаВБайтах Тогда
//Какие-то ваши действия, возможно
Возврат;
КонецЕсли;

ИмяФайлаОтправки = КаталогВременныхФайлов() + "post.txt";
ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.ANSI, Символы.ПС, ЛОЖЬ);

//Определяем раздел двоичных данных
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""data""; filename=""Naborki/" + ИмяФайл + """");

//С таким же успехом в Content-Type можно указать application/x-octet-stream
ФайлОтправки.ЗаписатьСтроку("Content-Type: text/html" + Символы.ПС + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(СодержимоеZIP);
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);

//Определяем раздел для каких либо других POST-данных, например содержимого полей виртуальной HTML-формы.
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);

//Соответствует HTML-тэгу input type="submit" name="submit" value="Submit" /
ФайлОтправки.ЗаписатьСтроку("Content-disposition: form-data; name=""submit""" + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку("1");
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);

ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
//Соответствует HTML-тэгу
//input type="text" name="some_field" value="Some text" /
ФайлОтправки.ЗаписатьСтроку("Content-disposition: form-data; name=""DataNaborki""" + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку("" + Формат(ДатаНаборки, "ДФ=yyyy-MM-dd"));
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);

ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
ФайлОтправки.ЗаписатьСтроку("Content-disposition: form-data; name=""Smena""" + Символы.ПС);
Если Смена = Перечисления.Смена.Первая Тогда
ФайлОтправки.ЗаписатьСтроку("1 смена");
Иначе
ФайлОтправки.ЗаписатьСтроку("2 смена");
КонецЕсли;
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);

ФайлОтправки.Закрыть();

ЗаголовокHTTP = Новый Соответствие();
//При необходимости зададим Referer, например таким образом
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
СерверИсточник = НСтр(СтрокаСоединения, "Srvr") + НСтр(СтрокаСоединения, "Ref");
ЗаголовокHTTP.Вставить("Referer", СерверИсточник);

//Укажем формат данных Content-Type
ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);

//Укажем длину POST-запроса Content-Length
ФайлОтправки = Новый Файл(ИмяФайлаОтправки);
РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
ЗаголовокHTTP.Вставить("Content-Length", РазмерФайлаОтправки);

Сервер = "w95595it.beget.tech"; //Естественно, следует указать свой адрес.
Порт = "80"; //Это общепринятый порт. Возможно, для вашего сервера применяется другой. Конкретное значение уточните у хостера.


//ИспользоватьПрокси - какая-то логическая переменная, может быть значение флажка на форме или переключатель
ИспользоватьПрокси = Ложь;
Если ИспользоватьПрокси Тогда
Прокси = Новый ИнтернетПрокси;
Прокси.НеИспользоватьПроксиДляЛокальныхАдресов = Истина;
Прокси.Пароль = "ПарольПрокси"; // укажите своё значение
Прокси.Пользователь = "ПользовательПрокси"; // укажите своё значение
НТТР = Новый HTTPСоединение(Сервер, Порт, , , Прокси);
Иначе
НТТР = Новый HTTPСоединение(Сервер, Порт);
КонецЕсли;

АдресСкрипта = "some_script.php"; //Естественно, следует указать имя своего скрипта.
Попытка
НТТР.ОтправитьДляОбработки(ИмяФайлаОтправки, АдресСкрипта, ИмяФайлаОтвета, ЗаголовокHTTP);
Исключение
//Пример обработки ошибки соединения.
#Если Клиент Тогда
Сообщить("Неудачная попытка соединения: " + ОписаниеОшибки());
#Иначе
ЗаписьЖурналаРегистрации("HTTPСоединение", УровеньЖурналаРегистрации.Ошибка, , , "Неудачная попытка соединения: " + ОписаниеОшибки());
#КонецЕсли
Возврат;
КонецПопытки;

//Удалим файл отправки POST-запроса. Больше он нам не нужен.
УдалитьФайлы(ИмяФайлаОтправки);

//АНАЛИЗИРУЕМ ОТВЕТ
ФайлОтвета = Новый Файл(ИмяФайлаОтвета);
Если ФайлОтвета.Существует() Тогда
ТекстОтвета = Новый ТекстовыйДокумент();
ТекстОтвета.Прочитать(ИмяФайлаОтвета);
Если ТекстОтвета.КоличествоСтрок() > 0 Тогда
ОтветСервера = ТекстОтвета.ПолучитьТекст();
Сообщить(ОтветСервера);
#Если Клиент Тогда
Сообщить(ОтветСервера);
#КонецЕсли
Иначе
#Если Клиент Тогда
Сообщить("Отправка файла на сервер: Получен пустой ответ сервера.");
#Иначе
ЗаписьЖурналаРегистрации("HTTPСоединение", УровеньЖурналаРегистрации.Ошибка, , , "Получен пустой ответ сервера.");
#КонецЕсли
КонецЕсли;

УдалитьФайлы(ИмяФайлаОтвета);
Иначе
#Если Клиент Тогда
Сообщить("Отправка файла на сервер: Ответ сервера не получен.");
#Иначе
ЗаписьЖурналаРегистрации("HTTPСоединение", УровеньЖурналаРегистрации.Ошибка, , , "Ответ сервера не получен.");
#КонецЕсли
КонецЕсли;


КонецПроцедуры
...
Рейтинг: 0 / 0
09.08.2017, 20:30
    #39502918
sserebann
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
vkle,

Нашел!!! Заменил строку в php скрипте
//$smena = $_POST['Smena'];
$smena = iconv('WINDOWS-1251', 'UTF-8', $_POST['Smena']);

Все заработало!!!
...
Рейтинг: 0 / 0
10.08.2017, 02:19
    #39503015
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
sserebannЭто DDL?Нет, но эта наскальная живопись картинка дает некоторое представление. По крайней мере, из картинки видно, что таблица ожидает данные в кодировке UTF-8. И оно никак не согласуется с Вашимsserebann"SET NAMES 'cp1251'"
Рано делать выводы, но оно как-то очень похоже на банальный бардак с кодировками. Вы можете точно сказать, какая кодировка данных должна быть в той или иной точке хранения и передачи данных - в одинэске, в полях запроса POST на передаче/приеме, в таблице, где-то ещё, где эта таблица будет использоваться?

Судя по sserebannФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста. ANSI , Символы.ПС, ЛОЖЬ);иsserebann"SET NAMES ' cp1251 '"данные из одинэски до таблицы `Naborki` должны бегать в кодировке cp1251 (она же windows-1251). Однако, это лишь мое предположение и оно никак не отражает Вашу идею. По крайней мере, по-прежнему, не понятно, почему в таблице UTF-8.
Если таблица не менялась (была как и сейчас utf-8) и SET NAMES так же не работал (дальше объясню, почему), тогда не вполне понятно, почему смена метода отправки с GET на POST привела к изменению кодировки данных с utf-8 (при использовании GET) на cp1251 (в POST). Возможно, это какая-то фича одинэскиных компонентов или нужно там где-то явно указать кодировку при передаче или нужно было конвертить ещё при записи во временный файл - сие мне неведомо. Думаю, есть смысл почитать одинэскину документацию по этой теме.

Или, может быть, Вы недоговариваете о каких-то ещё изменениях. Не ясно, например, почему коннект к СУБД и дальнейшая работа делается с использованием mysqli, а инициализация соединения использует старое расширение mysql (без i). Это совершенно разные инструменты. Хотя, решают они одни и те же задачи, но друг друга вообше не понимают (более того, в современных версиях PHP расширение mysql отсутствует). Естественно, такая инициализация не сработает. Есть даже вполне объяснимые причины почему без инициализации вчера работало, а сегодня уже нет. Например, изменение дефолтовых настроек СУБД.

sserebannНашел!!! Заменил строку в php скрипте
//$smena = $_POST['Smena'];
$smena = iconv('WINDOWS-1251', 'UTF-8', $_POST['Smena']);
Вполне логично для данного конкретного случая.

sserebannВсе заработало!!!Рад за Вас, но с кодировками таки разберитесь. Хотя бы, чтоб не удивляться в будущем вопросикам и крякозябрикам.
...
Рейтинг: 0 / 0
11.08.2017, 19:34
    #39504263
sserebann
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
vkle,

Спасибо что уделили мне время, я очень благодарен.
Подскажите пожалуйста литературу которая может помочь разобраться с кодировкой. Я ничего не пойму, если честно.
В 1с указана кодировка ANSI, есть еще кодировка файла php, кодировка таблицы mySql. Как это все упорядочить?
Вы правильно заметили что алгоритм-то работает а разобраться я не могу.
...
Рейтинг: 0 / 0
12.08.2017, 02:12
    #39504316
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос перестал работать
sserebann,

Про кодировки серьезную литературу не подскажу. Да хотя бы с Википедии можно начать.

По-простому, один и тот же символ в разных кодировках обозначается разными байтами или последовательностью байт (в многобайтовых кодировках). Соответственно, один и тот же байт в разных кодировках обозначает разные символы. Это приводит к крякозябрикам.

В каких-то кодировках некоторых символов вообще не существует. В каких-то кодировках не существует некоторых байтов. Это и может приводить к потере символов.


sserebannВ 1с указана кодировка ANSI, есть еще кодировка файла php, кодировка таблицы mySql. Как это все упорядочить?Упорядочивать - в соответствии с проектом и некоторой логикой. Для каждого случая она может быть индивидуальной. Ну, хранятся данные в одинэске в кодировке cp1251 - и пусть хранятся. Куда-то они экспортируются. Допустим, на сайт. Сперва данные как-то попадают в базу данных, потом на страничке сайта отображаются.

В какой кодировке сайт должен работать?

Допустим, в utf-8. Логично предположить, что и в таблицах данные должны храниться в этой же кодировке. И в скриптах и шаблонах тоже удобнее её использовать. В таком случае не придется выполнять преобразования по каждому чиху. Достаточно конвертнуть "чужеродные" данные один раз. Остается разобраться, в каком месте кодировка должна быть преобразована - в одинэске перед передачей или в скрипте сайта после приема данных. Это не принципиально в общем случае. Важно определить, где именно будут выполняться преобразования. PHP имеет инструменты преобразования кодировок. Имеет ли такие инструменты одинэска - не знаю (а ковырять документацию в третьем часу ночи мне лень). Поэтому, исходя из моих знаний, лично я сделал бы преобразование в скрипте сайта на PHP. Однако, в инструментарии одинэски Вы разбираетесь лучше меня, и тогда, возможно, в конкретном Вашем случае будет удобнее сразу отдавать данные на сайт в utf-8. В общем, подход тут индивидуальный.

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

Ну а если сайт должен работать в кодировке cp1251 - тогда, соответственно, никаких преобразований не требуется.

Вот как-то так, если коротко.

Хотя и никто не запрещает хранить одну табличку в отличной от других кодировке. И работать с таким зоопарком можно. Сильно сложнее, чем в случае с однородной кодировкой, но "при помощи молотка и какой-то матери" можно.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос перестал работать / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]