Я добавил функцию поиска в мою форму. Когда пользователь вводит дату 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 . "%'";
}
}
Давайте разбить его на 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]
соответственно. Вы можете поменять их местами и отформатировать по своему желанию.
Вы можете сделать это с помощью date
функция php как
$get_date = date('Y-m-d',strtotime($_GET['searchKeyword']));
использование PHP Date функция
date('Y-m-d',strtotime($_GET['searchKeyword']))
Ваш код в настоящее время небезопасен (уязвим для атак с использованием инъекций), поскольку вы используете в своем запросе нефильтрованные данные, предоставленные пользователем. Использование подготовленных выражений 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']
}
}
}