Я хотел бы принять от пользователя только небольшие и заглавные буквы.
Я попробовал приведенный ниже код, он перекликается с недопустимым символьным сообщением, но не работает. Я имею в виду, что он не проверяет. Он просто отображает сообщение. Любая помощь?
<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"; }