2

I m using some advanced mysql query for search some data from the database. But when I added LIKE WHERE developer LIKE %Lanterra% to the query, it will not work.

working query.

$query = sprintf("SELECT *, ( 3959 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance FROM condo HAVING distance < '%s' ORDER BY distance LIMIT 0 , 2500",
    mysql_real_escape_string($center_lat),
    mysql_real_escape_string($center_lng),
    mysql_real_escape_string($center_lat),
    mysql_real_escape_string($radius));

When I added LIKE function.(not working)

$query = sprintf("SELECT *, ( 3959 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance FROM condo WHERE developer LIKE %Lanterra% HAVING distance < '%s' ORDER BY distance LIMIT 0 , 2500",
    mysql_real_escape_string($center_lat),
    mysql_real_escape_string($center_lng),
    mysql_real_escape_string($center_lat),
    mysql_real_escape_string($radius));
Dumindu Madushanka
  • 484
  • 1
  • 8
  • 19

4 Answers4

4
SELECT * FROM `table` WHERE myfield like '%abc%';

You must use ' (single quotes)

manowar_manowar
  • 1,198
  • 2
  • 15
  • 32
2

I don't think sprintf() function will work to include sql statement and the store into a variable.

Try something like this:

$query = "SELECT *, ( 3959 * acos( cos( 
radians('".mysql_real_escape_string($center_lat)."') ) * cos( radians( latitude ) ) 
* cos( radians( longitude ) - radians('".mysql_real_escape_string($center_lng)."') ) 
+ sin( radians('".mysql_real_escape_string($center_lat)."') ) 
* sin( radians( latitude ) ) ) ) AS distance FROM condo
 HAVING distance < '".mysql_real_escape_string($radius))."'
 ORDER BY distance LIMIT 0 , 2500";

And then you can execute your query.

But BECAREFUL with mysql_* .

As Jay said in comments is true:

bcesars
  • 1,048
  • 1
  • 17
  • 36
1

Please, take care of this:

Nested query:

$query = sprintf("SELECT * FROM (SELECT *,
    ( 3959 * acos( cos( radians( %F ) ) * cos( radians( latitude ) ) *
    cos( radians( longitude ) - radians( %F ) ) + sin( radians( %F ) ) *
    sin( radians( latitude ) ) ) ) AS distance FROM condo WHERE
    developer LIKE '%%Lanterra%%') WHERE distance < %F
    ORDER BY distance LIMIT 0 , 2500",
    floatval($center_lat),
    floatval($center_lng),
    floatval($center_lat),
    floatval($radius)
);

Original query:

$query = sprintf("SELECT *, ( 3959 * acos( cos( radians( %F ) ) * cos( radians( latitude ) ) *
    cos( radians( longitude ) - radians( %F ) ) + sin( radians( %F ) ) *
    sin( radians( latitude ) ) ) ) AS distance FROM condo HAVING distance < %F
    WHERE developer LIKE '%%Lanterra%%' 
    ORDER BY distance LIMIT 0 , 2500",
        floatval($center_lat),
        floatval($center_lng),
        floatval($center_lat),
        floatval($radius)
);

Best regards.

OscarGarcia
  • 1,895
  • 16
  • 16
  • What error? Could you write it? PS: Ahhh, sorry! distance couldn't be used in ORDER BY! wait a minute :) I'll write a nested statement. – OscarGarcia Mar 02 '15 at 18:27
  • Warning: sprintf(): Too few arguments in C:\wamp\www\gmap\test.php on line 30 – Dumindu Madushanka Mar 02 '15 at 18:31
  • Now both of them will escape sprintf. %Landerra% could be misinterpreted because %L could be a special char, so we need to write it as \%Landerra\%. Try now. – OscarGarcia Mar 02 '15 at 18:35
  • Yes. % mark is the problem. but '\%Lanterra\%' also shows same error. – Dumindu Madushanka Mar 02 '15 at 18:38
  • Sorry!! %% as single %! Hahaha. Try again, write %% instead \% or single %. – OscarGarcia Mar 02 '15 at 18:41
  • This type of problems could be easily avoided using prepared statements from mysqli_* functions (or object mysqli) or using PDO. Take a look: http://php.net/mysqli.prepare and http://php.net/pdo.prepare – OscarGarcia Mar 02 '15 at 18:48
  • You can still using sprintf, but remember not to quote numbers (only strings) and to escape % characters with double % (%%) inside format string. – OscarGarcia Mar 02 '15 at 18:50
0

You can try instead double quotes " I've never used the LIKE keyword without them.

SELECT * FROM `db`.`table` WHERE `time` LIKE "%20150105%";