2016-06-22 3 views
1

Actualy Я знаю, как использовать LIKE заявление с PDOИспользование как с PDO на JSON-String

Теперь у меня есть DB-таблица называется, например, Foobar

Foobar содержит JSON-строки, как:

{"firstname":"foo","email":"[email protected]","lastname":"bar"} 

Теперь, прежде чем я называю ВСТАВКУ на столе, я хочу, чтобы проверить, если почта уже используется.

$pdo->query("SELECT * FROM myTable WHERE foobar LIKE ?", array('%' . $email . '%')); 

как вы можете видеть, я передаю электронное письмо в запрос pdo. Извещение ->query - это моя пользовательская функция, которая обрабатывает некоторые вещи. В этом случае не важно знать, что происходит.

Проблема у меня есть:

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

[email protected] 
^^....only two A's 

Так я думал, что я могу просто изменить

array('%' . $email . '%') 

в

array('%"' . $email . '"%') 

, но это не работает. Есть ли способ проверить всю строку?

{ "Имя": "Foo", "электронная почта": "[email protected]", "фамилия": "бар"}

+0

Я бы использовал ['REGEXP'] (http://dev.mysql.com/doc/refman/5.7/en/regexp.html) или [тип столбца JSON] (https: //dev.mysql .com/DOC/RefMan/5.7/ен/json.html). – bishop

+0

@bishop Я думаю, что regexp вызовет ту же проблему. Просмотр типа столбца JSON кажется довольно сложным :) – Dwza

+0

Слишком поздно переосмыслить это? –

ответ

1

Если вы не можете разбить поля JSON в их собственные столбцы, то я бы предложил JSON column type. Он является родным для MySQL, очень быстрый для JSON такого размера и не сложнее использовать, чем что-то вроде jq в командной строке.

Если это не вариант, я бы использовать REGEXP:

mysql> select * from foobar; 
+-----------------------------------------------------------+ 
| json              | 
+-----------------------------------------------------------+ 
| {"firstname":"foo","email":"[email protected]","lastname":"bar"} | 
| {"firstname":"FOO","email":"[email protected]","lastname":"BAR"} | 
+-----------------------------------------------------------+ 

mysql> select * from foobar where json regexp '"email":"[email protected]"'; 
+----------------------------------------------------------+ 
| json              | 
+----------------------------------------------------------+ 
| {"firstname":"FOO","email":"[email protected]","lastname":"BAR"} | 
+----------------------------------------------------------+ 
1 row in set (0.00 sec) 

Это исправен, но вряд ли пуленепробиваемые и занять отличную очередь фразы, будут убивать производительность на что-либо, кроме тривиального строки наборы.

+0

«Не пуленепробиваемый» является преуменьшением здесь. Это будет убивать вашу базу данных с нетривиальными подсчетами строк. – tadman

+0

@tadman Ты это сказал. Соответственно обновлено. – bishop

+0

, даже если я изменю свой DB-Design, это правильный ответ на мой вопрос, поэтому всем, кто ищет какой-то подобный, пожалуйста, внимательно прочитайте комментарии в моем вопросе! :) – Dwza

Смежные вопросы