2

This is my first question here and I hope it is simple enough to get a quick answer!

Basically, I have the following code:

$variable = curPageURL();
$query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE '$variable' ;

If I echo the $variable, it prints the current page's url( which is a javascript on my page)

Ultimately, what I want, is to be able to make a search for which the search-term is the current page's url, with wildcards before and after. I am not sure if this is possible at all, or if I simply have a syntax error, because I get no errors, simply no result!

I tried :

    $query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE '"echo $variable" ' ;

But again, I'm probably missing or using a misplaced ' " ; etc.

Please tell me what I'm doing wrong!

Jon Seigel
  • 12,251
  • 8
  • 58
  • 92
skarama
  • 487
  • 3
  • 8
  • 13

6 Answers6

26

Ultimately, what I want, is to be able to make a search for which the search-term is the current page's url, with wildcards before and after.

The SQL wildcard character is a percent sign. Therefore:

$variable = curPageURL();
$variable = mysql_real_escape_string($variable);
$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '%{$variable}%'";

Note: I've added in an extra bit of code. mysql_real_escape_string() will protect you from users deliberately or accidentally putting characters that will break your SQL statement. You're better off using parameterised queries, but that's a more involved topic than this simple fix.

Also note: I've fixed your string quoting, too. You can only use a variable in a string directly if that string is double quoted, and you were missing a quote at the end of $query.

edit 17 Jan 2015: Just got an upvote, so with that in mind, please don't use the mysql_* functions anymore.

ceejayoz
  • 176,543
  • 40
  • 303
  • 368
  • THANK YOU! You're a savior, thank you so much! I just noticed your edit, this is what I hadn't done!!It works fine now, thanks so much, and this site is definitly favorited. – skarama Dec 03 '09 at 23:16
  • This has been useful to me. Thank you:) – sg552 Feb 23 '12 at 16:00
8

Use:

$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '{$variable}'" ;

To get an idea of why to prevent SQL injection attacks, like the above would be vulnerable to, I submit "Exploits of a Mom":

alt text

Community
  • 1
  • 1
OMG Ponies
  • 325,700
  • 82
  • 523
  • 502
  • I get the idea but, the fields tablename and columnname aren't actual fieldnames, I changed the real ones. Or am I getting wrong? And I'm not taking offense, I'm quite happy I'm getting so many quick answers! – skarama Dec 03 '09 at 23:04
  • skarama: He means that you shouldn't create SQL queries using strings to enter parameters. By doing that, you're giving your users full access to your database (with the same permissions as your webserver). – Mark Byers Dec 03 '09 at 23:08
  • @Skarma: The point of SQL Injection attack is that it artificially terminates the string parameter you're attempting to populate, and then submit a second query immediately afterwards that is likely to be malicious. Doesn't matter what happens in the first query. – OMG Ponies Dec 03 '09 at 23:10
  • -1 for a non-working query. The variable won't be evaluated in a single-quoted string, it needs single quotes around the variable itself, and you're missing the wildcards the user requested. – ceejayoz Dec 03 '09 at 23:13
  • Thank you everyone, I will also take a look at SQL Injection attacks and try to learn how to prevent it :) – skarama Dec 04 '09 at 00:20
5

Please don't do this, it is vulnerable to SQL injection (this is a list of 138 StackOverflow questions you should read, absorb and understand prior to returning to your application). Use parametrized queries or stored procedures.

Community
  • 1
  • 1
Cade Roux
  • 88,164
  • 40
  • 182
  • 265
2

Use double quotes if you need to substitute variable values:

## this code is open for SQL injection attacks
$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '$variable'";

Or concat string manually:

## this code is open for SQL injection attacks
$query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE "' . $variable . '"';
Ivan Nevostruev
  • 28,143
  • 8
  • 66
  • 82
1

Your code is vulnerable to SQL injection attacks. User-supplied data should never be placed directly into a SQL query string. Instead, it must first be sanitized with a function such as mysql_real_escape_string().

streetparade
  • 32,000
  • 37
  • 101
  • 123
0

As to why you're not being notified of the syntax error: It's fairly likely that your error reporting settings aren't set up correctly.

Open php.ini and make sure the following is set:

display_errors = On

And:

error_reporting = E_ALL
Paul Lammertsma
  • 37,593
  • 16
  • 136
  • 187