Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

MySQL/Perl LIKE $string question

by peppiv (Curate)
on Jan 31, 2002 at 14:16 UTC ( #142487=perlquestion: print w/replies, xml ) Need Help??
peppiv has asked for the wisdom of the Perl Monks concerning the following question:

This is probably more of a MySQL question.
Let's start with the code:

my $sth = $dbh->prepare('SELECT * FROM applicants WHERE last_name LIKE + "%?%"; ORDER BY date_col, job_position'); $sth->execute($last_name) or die $sth->errstr;

Returns "execute called with 1 bind variables when 0 are needed"

What I'm trying to accomplish is searching the 'applicants' TABLE by column name 'last_name' using the LIKE statement. If I merely place text into this code it works. However, trying to pass a variable into it doesn't work. The $string in the sth works with a placeholder if I don't use LIKE. I've tried escaping the characters, putting the string directly in the LIKE statement and every variation I can think of.

Does anyone have any suggestions? I've looked at all my docs and mysql.com and found nothing about this.

peppiv

your lucky lotto numbers are 10 20 30 40 50!

Replies are listed 'Best First'.
Re: MySQL/Perl LIKE $string question
by gav^ (Curate) on Jan 31, 2002 at 14:21 UTC
    You need to use:
    my $sth = $dbh->prepare('SELECT * FROM applicants WHERE last_name LIKE + ? ORDER BY date_col, job_position'); $sth->execute("%$last_name%") or die $sth->errstr;

    gav^

      As an aside, when using a LIKE clause, there is can be a significant performance difference between   WHERE last_name LIKE 'smith%'
      and   WHERE last_name LIKE ?
      The difference depends on when the database does query planning, and on how sophisticated the query planning is. A sophisticated query planner will look at the first fragment, and determine (by noting no initial wildcard) that if last_name is indexed, the index can be used to optimize the query. However, in the second fragment, the planner can't make any assumptions, and will force a linear scan of the table even if last_name is indexed. For a big table, this can clobber performance.

      I know it work this way with Oracle, but haven't delved into MySQL to this depth. Perhaps someone with more experience can say whether this would also be an issue with MySQL.

      Super thanks gav^! It works. Where did you find this? I hate posting questions when they are so easily answered.

      peppiv


      Update:
      yes tachyon, been to that site many times and learned a lot! However, it didn't answer this particular question.
      I appreciate it!
        It's probably from how the placeholders are looked for in the query string. Since you're using MySQL, which IIRC doesn't have support for placeholders, that support is faked by the DBI level. Thus, it parses your string but doesn't look inside quoted blocks. So the placeholder in your "%?%" string isn't seen, and thus the DBI engine believes you have no placeholders, and fails on the execute.

        -----------------------------------------------------
        Dr. Michael K. Neylon - mneylon-pm@masemware.com || "You've left the lens cap of your mind on again, Pinky" - The Brain
        "I can see my house from here!"
        It's not what you know, but knowing how to find it if you don't know that's important

        Could I recommend this excellent article A short guide to DBI by our own dominus. It should get you on track in no time.

        cheers

        tachyon

        s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://142487]
Approved by root
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (6)
As of 2018-11-21 05:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My code is most likely broken because:
















    Results (237 votes). Check out past polls.

    Notices?