Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2012, 03:24   #1
Donatello
Форумчанин
 
Аватар для Donatello
 
Регистрация: 22.12.2010
Сообщений: 109
По умолчанию [php, mysql] Обработка регистра букв

Есть скрипт, который обрабатывает добавление данных в БД. Перед добавлением в БД идет проверка на наличие такой же записи, если запись есть, то блочим выполнение скрипта, если записи нет добавляем. Скрипт работает на 75% наверное, т.к. он данные добавляет, если есть совпадения то останавливает скрипт. Но если например в БД есть запись "Php" а в форму ввести "php" то скрипт сделает все правильно до if`ki т.е. если смотреть вывод каждой переменной пошагово, то запрос выберет правильную строку и все отлично, но if`ka не сделает своего дела, и создаст еще одну запись но уже такого вида "php" что отличается уже введенной только регистром первой буквы, подскажите как сделать так, что бы соблюдался еще и регистр букв в этой if`ke
PHP код:
<?php
    
include "db_mysqli_def.php";
    if(
$charset $mysqli->set_charset(utf8)){
        
$name $_POST['name'];
        
$query = ("SELECT name FROM section WHERE name = '$name'");
        
$result $mysqli->query($query);
        
$obj $result->fetch_object();
        if (
$obj->name == $_POST['name']){
            echo (
'Раздел существует, отредактируйте его или же создайте новый.');
        } else {
            if(
$stmt $mysqli->prepare('INSERT INTO section (name) VALUES (?)')){
                
$stmt->bind_param('s'$name);
                
$name $_POST['name'];
                
$stmt->execute();
                
$stmt->close();
                
$mysqli->close();
                echo(
'добавлено ');
            } else {
                
$stmt->error();
            }
        }
        
$result->close();
        
$mysqli->close();
    }
?>
П.С.: Не смотрите что код Албанский у меня простой вот такой кривой стиль и дописываю до нужного состояния скрипт только после того как он становится на 100% рабочим.
Я бы изменил мир, но бог не дает исходников (c)

И сказал мыслитель, напиши свою проблему на бумаге и ты увидишь свои ошибки.
Donatello вне форума Ответить с цитированием
Старый 05.01.2012, 04:26   #2
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

Для таких целей в самом mysql существует проверка на уникальность поля UNIQUE KEY
Если уж так любите php
Код:
$query = ("SELECT name FROM section WHERE LOWER(name) = '".strtolower($name)."');
Cronos20 вне форума Ответить с цитированием
Старый 05.01.2012, 05:05   #3
Donatello
Форумчанин
 
Аватар для Donatello
 
Регистрация: 22.12.2010
Сообщений: 109
По умолчанию

На сколько я понял функция strtolower($name) все буквы переведет в нижний регистр, что на мой взгляд делать в запросе SELECT глупо, т.к. такого не сделано в запросе INSERT. И буквы могут быть и большими, и тогда запрос опять будет работать не верно, точнее даже на запрос, а сравнение в if`ke, т.к. для php регистр букв играет значение.
Если сделать кодировку столбца utf8_bin, это помогает но на 50%. Т.е. слово "Php" и "php" будут разными, но и при выборке он будет учитывать регистр букв. А мне надо что бы "php" и "Php" или даже "PhP" означали одно и тоже, при этом что бы записывались в БД именно в том виде в котором указано.

UNIQUE KEY - тут не совсем понял подразумевается уникальность ячейки, или уникальность строки(id - primary key).
Если уникальность строки то получается пользователю надо будет помнить все id.
А если уникальность ячейки, то "PHP" "php" "PhP" каждый является по своему уникальным.
Я бы изменил мир, но бог не дает исходников (c)

И сказал мыслитель, напиши свою проблему на бумаге и ты увидишь свои ошибки.

Последний раз редактировалось Donatello; 05.01.2012 в 05:11.
Donatello вне форума Ответить с цитированием
Старый 05.01.2012, 09:57   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

вопрос та какой?
ADSoft вне форума Ответить с цитированием
Старый 05.01.2012, 15:52   #5
Donatello
Форумчанин
 
Аватар для Donatello
 
Регистрация: 22.12.2010
Сообщений: 109
По умолчанию

Код:
if ($obj->name == $_POST['name'])
Вот эта if`ka считает слова "Php" "PHP" "php" и другие вариации разными, как сделать что бы считала одинаковой, т.е. не зависило от регистра, но при этом в базу вносило в том виде, в котором его записали. Ну и читало от туда в том виде в котором записано, а вот сравнение не зависело от регистра.
Я бы изменил мир, но бог не дает исходников (c)

И сказал мыслитель, напиши свою проблему на бумаге и ты увидишь свои ошибки.
Donatello вне форума Ответить с цитированием
Старый 05.01.2012, 15:56   #6
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

Ну а я вам что написал???
Код:
if ($obj->name == $_POST['name'])
В этом случае вообще не понадобится .... будете проверять вернулось вообще хоть что-то из запроса или нет
P.S. Проверил UNIQUE KEY - не дает вставлять одинаковые строки в любом регистре ! Поэтому это самое корректное решение

Последний раз редактировалось Cronos20; 05.01.2012 в 16:05.
Cronos20 вне форума Ответить с цитированием
Старый 05.01.2012, 16:01   #7
Donatello
Форумчанин
 
Аватар для Donatello
 
Регистрация: 22.12.2010
Сообщений: 109
По умолчанию

Вы мне написали запрос SELECT где все буквы переменной $name изменяются в нижний регистр. При таком запросе, если пользователь введет "Php"(как прописано в БД), а запрос переделает все в нижний, эта ифка пропустит "Php" и будет 2 одинаковые записи с разными id вот и все. А мне нужно что бы в любом случае вносилось и считывалось в том регистре в котором введет пользователь в бд, а сравнивалось независимо от регистра или я что то упустил в вашем запросе?
Я бы изменил мир, но бог не дает исходников (c)

И сказал мыслитель, напиши свою проблему на бумаге и ты увидишь свои ошибки.
Donatello вне форума Ответить с цитированием
Старый 05.01.2012, 16:27   #8
Donatello
Форумчанин
 
Аватар для Donatello
 
Регистрация: 22.12.2010
Сообщений: 109
По умолчанию

Кажись понял про что ты говоришь сейчас попробую спасибо за ответ
Я бы изменил мир, но бог не дает исходников (c)

И сказал мыслитель, напиши свою проблему на бумаге и ты увидишь свои ошибки.
Donatello вне форума Ответить с цитированием
Старый 05.01.2012, 16:29   #9
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

А если так:
Код:
$query = ("SELECT name FROM section WHERE LOWER(name) = LOWER('$name')");
dr.Chas вне форума Ответить с цитированием
Старый 05.01.2012, 16:43   #10
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

Я еще раз повторяю, с точки зрения хранения данных, правильным будет поставить на поле `name` UNIQUE KEY и сразу делать insert в базу, при этом отлавливая ошибку вставки, и в этом случае показывать сообщение пользователю !!!! тчк
Cronos20 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение регистра букв frantic150 Microsoft Office Excel 11 30.08.2012 08:31
TopServer(PHP+MySQL+Apache+/etc), и обновление компонентов(в основном PHP) Пепел Феникса Софт 2 05.11.2011 14:38
что не так с php кдом или с настройками MySQL+PHP Jimmi Помощь студентам 2 27.12.2010 09:03
Изменение регистра букв VladimirAleks Общие вопросы Delphi 4 27.10.2009 19:27
Автоматическое исправление регистра букв apomin Microsoft Office Word 6 07.12.2008 00:29