05.01.2017, 13:02
|
Профессор
|
|
Регистрация: 20.01.2014
Сообщений: 150
|
|
Экранировал, решать задачу нет времени, я тут Вам свою задачу решить предлагаю вообще то!
|
|
05.01.2017, 13:22
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Какую задачу? О возможных причинах я сказал. Записать в базу можно что угодно. Если данные подготовлены, то обрезать их может только лимит установленный на длину поля VARCHAR.
|
|
05.01.2017, 13:24
|
Профессор
|
|
Регистрация: 20.01.2014
Сообщений: 150
|
|
Экранировал 2 способами: $str= str_replace("'","\'",$str);
$str= mysqli_real_escape_string($str);
Не помогло. Я думаю Ваша задача про заявки решаема. Времени нет полностью решать ее. Я тут известную Вам задачу решить не могу.
|
|
05.01.2017, 14:45
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от wadim
|
Экранировал 2 способами
|
$str= str_replace("'","\'",$str);
Экранируется вот так
$str= mysqli_real_escape_string($str);
А еще правильнее, в рамках mysqli и PDO использовать подготовленные запросы. Но, если речь о наборе чисел, то:
$a = [1, 2, 3];
echo json_encode($a); //[1, 2, 3] экранирование не требуется
$a = [1, "2", 3];
echo json_encode($a); //[1, "2", 3] нужно экранировать или
echo json_encode($a, JSON_NUMERIC_CHECK); //[1, 2, 3] экранирование не требуется
//но если данные извне и ожидаем только числа, то:
$a = array_map('intval', $a);
$json = json_encode($a);
//и с записью этой строки проблем не будет
"UPDATE table SET field='$json'"
Понял о какой задаче. Решать можно многое, но в данном случае большой кровью.
Последний раз редактировалось laimas, 05.01.2017 в 18:26.
|
|
06.01.2017, 10:15
|
Профессор
|
|
Регистрация: 20.01.2014
Сообщений: 150
|
|
Все заработало, возможно было дело в том что Вы написали, а так основная ошибка была в логике скрипта. Но в любом случае большое спасибо. Еще остался вопрос, как удалять и изменять(а также другие операции проводить) данные в строке-массиве, который в одном поле базы. Вот пример который у меня работает, но не всегда:
mysqli_query($myConnect, " UPDATE `red` SET `red` = CONCAT(`red`, ',' , '{$Log}') ");
Напишите пожалуйста подобные строки в таком же синтаксисе, я имею в виду не в ООП и в других вариантах.
Последний раз редактировалось wadim, 06.01.2017 в 10:27.
|
|
06.01.2017, 17:56
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от wadim
|
как удалять и изменять(а также другие операции проводить) данные в строке-массиве, который в одном поле базы.
|
Те кто понимают, что запаковать данные, надо которыми требуется постоянно производить операции, делать выборку по ним как произвольную так и по условиям, это удавка на шее, тот никогда подобным образом данные хранить не будет. А не будет именно потому, что как раз сделать это будет весьма затруднительно, а во многих случаях и не возможно. Я вам об этом сказал сразу, но ... Так что мне сказать нечего по данному поводу.
Вот здесь также думают что строка в одном поле, это удобно и круто, а потом маются.
|
|
07.01.2017, 05:03
|
Профессор
|
|
Регистрация: 20.01.2014
Сообщений: 150
|
|
Я все понимаю, быстродействие мне нужно, но удобство порой важней, мне нужно только удалять значение из строки-поля, удалять я могу, только запятые остаются, с этим может и справлюсь, просто хотел бы посмотреть на Ваше решение, мож оно будет лучше. Мне нужны варианты, чтобы был выбор, а ставить то или иное решение в виде панацеи я не стал бы и Вам не советую. Я читал о мнении что удобство порой важней даже производительности и согласен с этим. Массив я хочу запихивать так: $str= implode(',', $arr);
а не через json_encode. Будет ли это правильным?
|
|
07.01.2017, 05:41
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Я и не говорю о быстродействии, я говорю о невозможности выполнения задачи.
Оставьте в покое sql и возьмите к примеру строку "a, b, c, d, f". Считаем, что у вашего РНР нет функции explode(), а также регулярных выражений. Требуется заменить f на e.
Если мы знаем, что позиция f последняя, то это легко сделать. Также не будет затруднений если она будет первой, и даже в середине, и мы знаем эту позицию. Но если мы не знаем позиции, если символов в строке может быть сколь угодно, то задача кардинально усложняется - нужно получить подстроку до первой запятой, затем из остатка следующую подстроку до запятой и т.д. пока не обнаружим символ.
Теперь мысленно перенесите этот процесс замены в sql. Надо ли еще говорить, что это и есть причина по которой так данные в базе не хранят?
Если массив числа, то конечно не проблема просто объединять их разделителем.
|
|
07.01.2017, 05:50
|
Профессор
|
|
Регистрация: 20.01.2014
Сообщений: 150
|
|
Мне замена не нужна, мне добавление и удаление нужны пока, понимаю что на будущее и можно оставить задел, но в будущем можно переписать и базу и код под новые условия, хотя это и может быть сложно до невозможности. Пока буду исходить из того что есть. Мне только нужно удалить к примеру 44 из 15,44,10. И знать могу ли я json_encode заменить на implode.
|
|
07.01.2017, 06:20
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
А добавление и удаление разве не модификация? Если добавить в конец строки не проблема, то удалить в произвольном месте, это еще надо найти, а с какими трудностями это связано я уже устал говорить. Средствами sql бескровно этого не сделать, нет в mysql реализации замены по регулярному выражению.
Вы изначально неверно представили хранение данных в неудобном для задачи формате, отсюда и проблемы ваши. Ну это же очевидно - к примеру пишите вы сайт для организации. На страницах будет выводиться информация о ней, включая и ее телефоны. Это практически постоянные данные, а если изменились, или вместо запятой их нужно вывести через пробел, так для этого есть административный раздел сайта, в нем строку с телефонами в поле ввода откорректировали и сохранили.
Но хранить телефоны клиентов этой организации в строке через разделитель, до этого вряд ли бы вы додумались, так как каике-то нужно будет и удалять, по номерам нужно будет и выборку делать, а при добавлении новых нужно проверять есть ли такой номер в базе, и т.д., и т.п. К тому же, если хорошо думать, то и храниться номер будет ни как 8(999)... и с прочими вариациями, а только числа.
У вас может и меньший объем, строка короче, но как раз потому что вы данные вогнали в строку, вы и огребли проблем по полной. И это может быть еще только началом.
|
|
|
|