у меня есть следующая таблица для new_supplier_request:
Id | ref | User | Manager (Varchar)
1 12 James Henry O'Brien
У меня также есть моя таблица internal_users:
Id | User_firs_name | user_last_name(Varchar)
1 Henry O'Brien
я использую следующий запрос mysql, чтобы дать разрешение менеджера (который вошел в систему) для просмотра некоторого контента, если имя менеджера появляется для этой строки данных в столбце менеджера моей таблицы new_supplier_request
$_SESSION['username'] = internal_users.user_first_name
$_SESSION['username2'] = internal_users.user_last_name
$user = $_SESSION['username']." ".$_SESSION['username2'];
$sql34 = "select * from new_supplier_request, internal_users where new_supplier_request.status!= 'complete' and new_supplier_request.action_taken ='none' AND new_supplier_request.user_id = internal_users.user_id AND requestee_manager = '$user'";
$result = $conn->query($sql34);
По какой-то причине это работает нормально, если фамилия не содержит апостроф, но поскольку фамилия этого менеджера — О’Брайен, по какой-то причине, когда я проверяю в своем запросе, он терпит неудачу, потому что испытывает затруднения при чтении апострофа в имени, если я поменяю фамилию Генри на что-то вроде Джеймса, то это сработает. Может кто-нибудь объяснить, пожалуйста, что я делаю не так? Спасибо
Проверьте это:
$_SESSION['username'] = mysqli_real_escape_string($conn, internal_users.user_first_name);
$_SESSION['username2'] = mysqli_real_escape_string($conn, internal_users.user_last_name);
Вы должны рассмотреть возможность использования PDOПодготовлены заявления со связанными параметрами.
Таким образом, ваши запросы будут безопаснее, и многие проблемы со строковыми параметрами должны быть решены.
$query = $pdo->prepare('
select *
from new_supplier_request, internal_users
where new_supplier_request.status <> :status
and new_supplier_request.action_taken = :action_taken
AND new_supplier_request.user_id = internal_users.user_id
AND requestee_manager = :user
');
$query->bindValue(':status', 'complete');
$query->bindValue(':action_taken', 'none');
$query->bindValue(':user', $user);
$query->execute();
$results = $query->fetchAll();
Проходить $conn->real_escape_string($user)
вместо $user
в запросе. Вы НИКОГДА не должны использовать значения переменных непосредственно в запросе, не применяя тип или не экранируя их, так как вы оставите код уязвимым для атак SQL-инъекций.