Как условно переформатировать ввод пользователя, если строка даты от дд / мм / гггг до гггг-мм-дд?

Я добавил функцию поиска в мою форму. Когда пользователь вводит дату 18/03/2015 тогда я хочу переформатировать дату. мне нужно изменить $_GET['searchKeyword'] от '18/03/2015' в '2015-03-18' и сохранить как $searchKeyword,

Я хочу это для моего sql LIKE пункт.
Я пишу так, но это не работает:

$where_clause = '';
$searchKeyword =  $_GET['search_keyword'];

if ($_GET['search_keyword'] != '')
{
if (preg_match('/^(\d\d)\/(\d\d)\/(\d\d\d\d)$/', $_GET['searchKeyword'], $m))
{
$searchKeyword = "$m[3]-$m[2]-$m[1]";
$where_clause = " where patient_id  like '%" .$searchKeyword . "%'
or patient_name like '%" .$searchKeyword . "%'
or in_date like '%" . $searchKeyword . "%'
or discharge_date like '%" . $searchKeyword ."%'";
} else {
$where_clause = " where patient_id  like '%" .$searchKeyword . "%'
or patient_name like '%" .$searchKeyword . "%'
or in_date like '%" . $searchKeyword . "%'
or discharge_date like '%" . $searchKeyword . "%'";
}
}

0

Решение

Давайте разбить его на 2 части:

(1) Узнайте, соответствует ли он шаблону

if (preg_match('/^(\d\d)\/(\d\d)\/(\d\d\d\d)$/', $_GET['searchKeyword'], $m)) {

(2) Назначьте вашу переменную

    $searchKeyword = "$m[3]-$m[2]-$m[1]";
}

Вышеуказанное регулярное выражение «захватило» 3 разные группы (часть в паранах), которые затем доступны как $m[1], $m[2], а также $m[3]соответственно. Вы можете поменять их местами и отформатировать по своему желанию.

0

Другие решения

Вы можете сделать это с помощью date функция php как

$get_date = date('Y-m-d',strtotime($_GET['searchKeyword']));
1

использование PHP Date функция

date('Y-m-d',strtotime($_GET['searchKeyword']))
0

Ваш код в настоящее время небезопасен (уязвим для атак с использованием инъекций), поскольку вы используете в своем запросе нефильтрованные данные, предоставленные пользователем. Использование подготовленных выражений mysqli с заполнителями поможет решить эту проблему.

Я собираюсь предположить, что ваш patient_id столбец INT типа (но я не знаю вашу структуру таблицы). Если это не так, вы можете отменить мой CAST(),

Что касается использования LIKE на DATE введите данные (я не знаю вашу структуру таблицы), пожалуйста, прочитайте эта почта. Это разумный аргумент для реинжиниринга построения запроса с использованием YEAR/MONTH/DAY,

Я позволил себе сделать вашу поисковую функцию «более доступной». Мой запрос не только выполняет поиск по четырем нужным столбцам, используя LIKEкогда подана строка Можно интерпретировать как дату ( strtotime()), еще два условия добавляются к WHERE предложение, которое использует отформатированные данные в двух столбцах даты.

Эффективно, если пользователь вводит: yesterdayзатем любые строки с именем пациента, содержащие yesterday или с in_date точно совпадающий 2018-04-21 или же discharge_date точно совпадающий 2018-04-21 будет возвращен. (на момент публикации это 22 апреля 2018 года) March 31 будет искать в столбцах даты совпадения 2018-03-31, Ничего не потеряно; только больше безопасности и гибкости, но, возможно, может быть возвращено слишком много строк (это вы должны определить).

if (!$conn = new mysqli("localhost", "username", "password", "database")) {  // use your own details obviously
echo "Connect failed: " , $conn->connect_error);  // never display errors to the public
} elseif (empty($_GET['search_keyword'])) {
if (!$result = $conn->query("SELECT * FROM `table`")) {
echo "Syntax error on query with no keyword";
} else {
while ($row = $result->fetch_assoc()) {
// do what you wish with $row['columnname']
}
}
} else {
$query = "SELECT * FROM `table` WHERE";
$query .= " CAST(`patient_id` AS CHAR) LIKE ? OR `patient_name` LIKE ?";
$query .= " OR `in_date` LIKE ? OR `discharge_date` LIKE ?";
$wrapped = "%" . $_GET['search_keyword'] . "%";  // wrap the values with % for binding downscript
if (($unix = strtotime($_GET['search_keyword'])) !== false) {
$query .= " OR `in_date` = ? OR `discharge_date` = ?";
$reformatted = date('Y-m-d', $unix);
}
if(!$stmt=$conn->prepare($query)) {
echo "Error on prepare: " , $conn->error;
} elseif (isset($reformatted) && !$stmt->bind_param("ssssss", $wrapped,  $wrapped, $wrapped, $wrapped, $reformatted, $reformatted)) {
echo "Error on bind (x6 params): " , $stmt->error;
} elseif (!isset($reformatted) && !$stmt->bind_param("ssss", $wrapped, $wrapped, $wrapped, $wrapped)) {
echo "Error on bind (x4 params): " , $stmt->error;
} elseif (!$stmt->execute()) {
echo "Error on execute: " , $stmt->error;
} elseif (!$result = $stmt->get_result()) {
echo "Error on get result: " , $stmt->error;
} else {
while ($row = $result->fetch_array(MYSQLI_ASSOC)){
// do what you wish with $row['columnname']
}
}
}
0
По вопросам рекламы [email protected]