Разрешать только столичные и маленькие буквы

Я хотел бы принять от пользователя только небольшие и заглавные буквы.

Я попробовал приведенный ниже код, он перекликается с недопустимым символьным сообщением, но не работает. Я имею в виду, что он не проверяет. Он просто отображает сообщение. Любая помощь?

<form action="" method="post"> <input type="text" name="fname"> <input type="submit" value="Send" name="submit"> </form> 

Обновление: это то, что я должен проверить и вставить имя в базу данных. если числа, найденные в имени, отклоняют имя, отображая сообщение об ошибке else, если имя содержит только буквы, вставьте его в базу данных. Это все, что я хочу добиться.

 <?php if ( isset( $_POST['submit'] ) ) { $fname = $_POST["fname"]; if(!preg_match ('/^([a-zA-Z]+)$/', $fname)){ echo "Invalid characters"; } if (empty($fname)) { echo '<span> First name is required</span>'; } else{ $mysqli = new mysqli("localhost", "root", "", "test"); $stmt = $mysqli->prepare("INSERT INTO test (firstname) VALUES (?)"); $stmt->bind_param("s", $fname); $stmt->execute(); $stmt->close(); $mysqli->close(); } } ?> 

 if(!isset($_POST['fname']) || !ctype_alpha($_POST['fname'])){ // can i haz alpha letters only? } 

( ссылка )

Если вы просто хотите проверить, что вы можете использовать ctype_alpha (), но вы сказали, что хотите ПРИНИМАЕТ только буквы, поэтому, если вы решите принять вход, вы можете:

 $fname=preg_replace('/[^az]/i','',$fname); 

лучше после проверки

Есть несколько проблем с кодом, и тот, который вы застряли, вероятно, у вас есть форма и ее обработка в том же файле PHP. Это возможно, но для этого требуется другой подход. Для стартера, вероятно, лучше разделить их.

Что происходит с отправленным кодом, так это то, что PHP-процессор пытается обработать данные формы, когда форма не была отправлена, даже не проверяя наличие данных. Теперь $fname не определено, поэтому тест всегда терпит неудачу.

Тест тоже неправильный. Теперь он проверяет, содержит ли $fname хотя бы одну букву. Например, if(!preg_match ('/^[a-zA-Z]+$/', $fname)) проверит, что $fname состоит из одного или нескольких букв Ascii и ничего другого.

Общая идея проверки символов, не соответствующих [a-zA-Z] , является хорошей.

Тем не менее, «не» часть вашего условия if находится в неправильном месте, если вы хотите, чтобы это работало. Теперь у вас есть только то, что любой символ в fname является латинской буквой верхнего или нижнего регистра.

Вы хотите нажать «не» часть логики в шаблон:

 if (preg_match('/[^a-zA-Z]/', $fname)) { 

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

Изменить: у вашего нового обновления есть другой тест, который также работает (он, кажется, из обновленного ответа исходного кода, но у вас есть несколько тестов из разных ответов здесь, которые будут работать одинаково хорошо). Но ваш обновленный пост дает понять, что ваша проблема не связана с шаблоном тестирования имени.

Ваш код выглядит так:

 if (/* invalid fname */) { echo "Invalid characters"; } if (/* empty fname */) { echo '<span> First name is required</span>'; } else { /* insert into database */ } 

Это предложение else зависит только от того, что происходит непосредственно перед ним: проверить, является ли fname пустым. Другими словами, независимо от результата вашей проверки против символов fname , вы вставляете ее в базу данных всякий раз, когда она не пуста.

Один простой способ исправить это – просто изменить свою вторую, if на elseif . Это приведет к объединению всех трех условных чисел, поэтому последний блок else будет выполняться только в том случае, если оба предыдущих условия, которые печатают сообщения об ошибках, не были вызваны.

 if (/* empty fname */) { echo 'First name is required.'; } elseif (/* invalid fname */) { echo 'Invalid characters'; } else { /* insert into database */ } 

используйте это, это дает мне правильный ответ

 if(!preg_match ('/^([a-zA-Z]+)$/', $fname)){ echo "Invalid characters"; } else{ echo "correct"; }