Я выполняю следующий запрос, используя MySQL, и получаю точные результаты из базы данных:
SELECT *
FROM ODB_RG
WHERE fullAddressV1 = 'רמת גן חרושת 1'
OR fullAddressV2 = 'רמת גן חרושת 1'
OR fullAddressV3 = 'רמת גן חרושת 1'
OR fullAddressV4 = 'רמת גן חרושת 1'
С другой стороны, выполнение следующего php-кода, который фактически сгенерировал запрос, эквивалентный указанному выше, не возвращает никакой записи:
$fullAddress = "1 רמת גן חרושת";
$stmt = $con->prepare("SELECT * FROM ODB_RG WHERE fullAddressV1 = :address1 ". "OR fullAddressV2 = :address2 OR fullAddressV3 = :address3 ". "OR fullAddressV4 = :address4");
$stmt->bindParam(':address1',$fullAddress);
$stmt->bindParam(':address2',$fullAddress);
$stmt->bindParam(':address3',$fullAddress);
$stmt->bindParam(':address4',$fullAddress);
$status = $stmt->execute();
Единственная разумная причина, которая может привести к разнице между решениями, — это строка на иврите, которая передается в качестве параметра.
Кто-нибудь из вас имеет представление, что нужно сделать, чтобы это исправить?
Заранее спасибо !
РЕДАКТИРОВАТЬ :
Это сопоставление, которое я использую для соответствующей таблицы:
engine=MyISAM charset=UTF8 COLLATE = utf8_general_ci;
Вот что я имел в виду под проверкой ошибок:
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$fullAddress = "1 רמת גן חרושת";
$stmt = $con->prepare("SELECT * FROM ODB_RG WHERE fullAddressV1 = :address1 ". "OR fullAddressV2 = :address2 OR fullAddressV3 = :address3 ". "OR fullAddressV4 = :address4");
if (!$stmt) {
echo "\nPDO::errorInfo():\n";
print_r($con->errorInfo());
die();
}
$stmt->bindParam(':address1',$fullAddress);
$stmt->bindParam(':address2',$fullAddress);
$stmt->bindParam(':address3',$fullAddress);
$stmt->bindParam(':address4',$fullAddress);
$status = $stmt->execute();
if (!$status ) {
echo "\nPDO::errorInfo():\n";
print_r($con->errorInfo());
die();
}
if($row = $stmt->fetch()){
var_dump($row);
}else{
echo 'no row found';
}
Я знаю, что это очень плохо, иногда это называется защитным программированием, но оно позволяет узнать, что происходит.
Других решений пока нет …