2016-03-11 1 views
0

Хорошо, поэтому я обычно ищу и ищу, пока не найду решение, но я думаю, что это первая задача, которая выходит за рамки меня. Будем надеяться, что это не глупая ошибка! Вот мой первый пост ...% создает синтаксическую ошибку в sql LIKE search for json_encode

Код ниже - это модифицированный скрипт локатора хранилища, и все работает нормально, пока я не добавлю знак% в LIKE-часть инструкции sql. Когда его нет, я могу получить точные результаты поиска из инструкции LIKE, поэтому я знаю, что весь остальной код в порядке, но как только я добавлю знак%, я получаю сообщение об ошибке.

Что происходит, ребята ?!

<?php 

header('Access-Control-Allow-Origin: *'); 

$con = mysqli_connect("$host","$user","$password","$db"); 
if (!$con) { 
die('Could not connect: ' . mysqli_error($con)); 
} 

mysqli_select_db($con,"sakila"); 

// Get parameters 
$mlat = $_POST["lat"]; 
$mlng = $_POST["lng"]; 
$radius = $_POST["radius"]; 
$gamename = $_POST["gamename"]; 
$idGames2 = $_POST["idGames2"]; 
$matchtype2 = $_POST["matchtype2"]; 


// Search the rows in the markers table 
//change 3959 to 6371 for distance in KM 
$sql = sprintf("SELECT (ignore this there's lots of requested collumns), 
lat, lng, (3959 * acos(cos(radians('%s')) * cos(radians(lat)) * cos(radians(lng) - radians('%s')) + sin(radians('%s')) * sin(radians(lat)))) 
AS distance FROM games WHERE name LIKE '%lue' AND matchtype=$matchtype2 HAVING distance < '%s' ORDER BY distance LIMIT 0 , 20 ", 
    mysqli_real_escape_string($con,$mlat), 
    mysqli_real_escape_string($con,$mlng), 
    mysqli_real_escape_string($con,$mlat), 
    mysqli_real_escape_string($con,$radius)); 

$result = mysqli_query($con,$sql); 
$rows = array(); 
while($r = mysqli_fetch_assoc($result)) { 
    $rows[] = $r; 
} 
mysqli_close($con); 

echo json_encode($rows); 
?> 

Оператор LIKE оператор должен забрать «синий, где я написал„имя% LUE“, потому что есть результат поиска соответствия для него, но он бросает ошибку.

Надеюсь, это было ясно и лаконично! Любая помощь ценится !!

+1

Какая ошибка? –

ответ

0

Прежде всего, пожалуйста, настоятельно удалить действительно сейчас такую ​​вещь:

$matchtype2 = $_POST["matchtype2"]; 
sprintf("SELECT (ignore this there's lots of requested collumns), lat, lng, (3959 * acos(cos(radians('%s')) * cos(radians(lat)) * cos(radians(lng) - radians('%s')) + sin(radians('%s')) * sin(radians(lat)))) AS distance FROM games WHERE name LIKE '%lue' AND matchtype=$matchtype2 HAVING distance < '%s' ORDER BY distance LIMIT 0 , 20 ", 

Инъекционного прямые переменные из внешних источников (например, $ _POST) есть путь открыт довести систему вниз, также известной как. .. SQL-инъекции.

So.

Вы используете sprintf там, возможно, чтобы заменить% s на ваше значение. Это может быть хорошей идеей, но это означает, что вы больше не можете использовать «%». Итак, вы можете избежать этого или не использовать sprintf, как хотите.

Я настоятельно рекомендую вам использовать привязки параметров в подготовленных операциях, поможет вам как с параметрами, так и с безопасностью.

Например, с хорошим DB класса (PDO), мы можем сделать, как:

$sql = "SELECT (ignore this there's lots of requested collumns), lat, lng, (3959 * acos(cos(radians(:d1)) * cos(radians(lat)) * cos(radians(lng) - radians(:d2)) + sin(radians(:d3)) * sin(radians(lat)))) AS distance FROM games WHERE name LIKE AND matchtype=:matchType HAVING distance < :distance ORDER BY distance LIMIT 0 , 20 " 
$db->query($sql, array(
    'd1' => $d1, 
    'd2' => $d2, 
    'd3' => $d3, 
    'matchType' => $_REQUEST['matchType'], 
    'distance' => $dist 
)); 

EDIT: FYI, спасаясь% в Sprintf осуществляется путем удвоения знак%: %% Смотри на PHP doc (как всегда наш лучший друг): http://php.net/sprintf

+0

Ты гений! Спасибо, он работает! – Tricky

+0

Я знаю, что я, возможно, не делаю это самым безопасным способом на данный момент, но когда я учу код, в то же время я буду ужесточить безопасность, как только все закончится, и ура! – Tricky

+0

Обратите внимание также на первый элемент (SQL-инъекции). В любом случае это ДЕЙСТВИТЕЛЬНО большая проблема. EDIT: erm, ладно. Просто не попадайте в ловушку «позже, никогда». – Lpu8er