Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 05.01.2017, 13:02
Профессор
Отправить личное сообщение для wadim Посмотреть профиль Найти все сообщения от wadim
 
Регистрация: 20.01.2014
Сообщений: 150

Экранировал, решать задачу нет времени, я тут Вам свою задачу решить предлагаю вообще то!
Ответить с цитированием
  #12 (permalink)  
Старый 05.01.2017, 13:22
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Какую задачу? О возможных причинах я сказал. Записать в базу можно что угодно. Если данные подготовлены, то обрезать их может только лимит установленный на длину поля VARCHAR.
Ответить с цитированием
  #13 (permalink)  
Старый 05.01.2017, 13:24
Профессор
Отправить личное сообщение для wadim Посмотреть профиль Найти все сообщения от wadim
 
Регистрация: 20.01.2014
Сообщений: 150

Экранировал 2 способами: $str= str_replace("'","\'",$str);
$str= mysqli_real_escape_string($str);
Не помогло. Я думаю Ваша задача про заявки решаема. Времени нет полностью решать ее. Я тут известную Вам задачу решить не могу.
Ответить с цитированием
  #14 (permalink)  
Старый 05.01.2017, 14:45
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от 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.
Ответить с цитированием
  #15 (permalink)  
Старый 06.01.2017, 10:15
Профессор
Отправить личное сообщение для wadim Посмотреть профиль Найти все сообщения от wadim
 
Регистрация: 20.01.2014
Сообщений: 150

Все заработало, возможно было дело в том что Вы написали, а так основная ошибка была в логике скрипта. Но в любом случае большое спасибо. Еще остался вопрос, как удалять и изменять(а также другие операции проводить) данные в строке-массиве, который в одном поле базы. Вот пример который у меня работает, но не всегда:
mysqli_query($myConnect, " UPDATE `red` SET `red` = CONCAT(`red`, ',' , '{$Log}') ");
Напишите пожалуйста подобные строки в таком же синтаксисе, я имею в виду не в ООП и в других вариантах.

Последний раз редактировалось wadim, 06.01.2017 в 10:27.
Ответить с цитированием
  #16 (permalink)  
Старый 06.01.2017, 17:56
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от wadim
как удалять и изменять(а также другие операции проводить) данные в строке-массиве, который в одном поле базы.
Те кто понимают, что запаковать данные, надо которыми требуется постоянно производить операции, делать выборку по ним как произвольную так и по условиям, это удавка на шее, тот никогда подобным образом данные хранить не будет. А не будет именно потому, что как раз сделать это будет весьма затруднительно, а во многих случаях и не возможно. Я вам об этом сказал сразу, но ... Так что мне сказать нечего по данному поводу.

Вот здесь также думают что строка в одном поле, это удобно и круто, а потом маются.
Ответить с цитированием
  #17 (permalink)  
Старый 07.01.2017, 05:03
Профессор
Отправить личное сообщение для wadim Посмотреть профиль Найти все сообщения от wadim
 
Регистрация: 20.01.2014
Сообщений: 150

Я все понимаю, быстродействие мне нужно, но удобство порой важней, мне нужно только удалять значение из строки-поля, удалять я могу, только запятые остаются, с этим может и справлюсь, просто хотел бы посмотреть на Ваше решение, мож оно будет лучше. Мне нужны варианты, чтобы был выбор, а ставить то или иное решение в виде панацеи я не стал бы и Вам не советую. Я читал о мнении что удобство порой важней даже производительности и согласен с этим. Массив я хочу запихивать так: $str= implode(',', $arr);
а не через json_encode. Будет ли это правильным?
Ответить с цитированием
  #18 (permalink)  
Старый 07.01.2017, 05:41
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Я и не говорю о быстродействии, я говорю о невозможности выполнения задачи.

Оставьте в покое sql и возьмите к примеру строку "a, b, c, d, f". Считаем, что у вашего РНР нет функции explode(), а также регулярных выражений. Требуется заменить f на e.

Если мы знаем, что позиция f последняя, то это легко сделать. Также не будет затруднений если она будет первой, и даже в середине, и мы знаем эту позицию. Но если мы не знаем позиции, если символов в строке может быть сколь угодно, то задача кардинально усложняется - нужно получить подстроку до первой запятой, затем из остатка следующую подстроку до запятой и т.д. пока не обнаружим символ.

Теперь мысленно перенесите этот процесс замены в sql. Надо ли еще говорить, что это и есть причина по которой так данные в базе не хранят?

Если массив числа, то конечно не проблема просто объединять их разделителем.
Ответить с цитированием
  #19 (permalink)  
Старый 07.01.2017, 05:50
Профессор
Отправить личное сообщение для wadim Посмотреть профиль Найти все сообщения от wadim
 
Регистрация: 20.01.2014
Сообщений: 150

Мне замена не нужна, мне добавление и удаление нужны пока, понимаю что на будущее и можно оставить задел, но в будущем можно переписать и базу и код под новые условия, хотя это и может быть сложно до невозможности. Пока буду исходить из того что есть. Мне только нужно удалить к примеру 44 из 15,44,10. И знать могу ли я json_encode заменить на implode.
Ответить с цитированием
  #20 (permalink)  
Старый 07.01.2017, 06:20
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

А добавление и удаление разве не модификация? Если добавить в конец строки не проблема, то удалить в произвольном месте, это еще надо найти, а с какими трудностями это связано я уже устал говорить. Средствами sql бескровно этого не сделать, нет в mysql реализации замены по регулярному выражению.

Вы изначально неверно представили хранение данных в неудобном для задачи формате, отсюда и проблемы ваши. Ну это же очевидно - к примеру пишите вы сайт для организации. На страницах будет выводиться информация о ней, включая и ее телефоны. Это практически постоянные данные, а если изменились, или вместо запятой их нужно вывести через пробел, так для этого есть административный раздел сайта, в нем строку с телефонами в поле ввода откорректировали и сохранили.

Но хранить телефоны клиентов этой организации в строке через разделитель, до этого вряд ли бы вы додумались, так как каике-то нужно будет и удалять, по номерам нужно будет и выборку делать, а при добавлении новых нужно проверять есть ли такой номер в базе, и т.д., и т.п. К тому же, если хорошо думать, то и храниться номер будет ни как 8(999)... и с прочими вариациями, а только числа.

У вас может и меньший объем, строка короче, но как раз потому что вы данные вогнали в строку, вы и огребли проблем по полной. И это может быть еще только началом.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как записать массив в базу mysqli. wadim Серверные языки и технологии 0 04.01.2017 18:10
Как записать массив в базу mysqli. wadim Общие вопросы Javascript 1 04.01.2017 18:05
Как записать видео из canvas? Dimaz Общие вопросы Javascript 6 10.09.2014 21:39
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Как лучше сделать глобальный массив skyfish AJAX и COMET 4 17.02.2009 18:05