tags:

views:

86

answers:

3

Hi, I'm working on learning to use prepared statements with mysqli in PHP and usually, if I'm having a problem with a query I just echo it to the screen to see what it looks like as a first step.

How can I do that with a prepared statement?

I'd like to see the SQL statement after the variables are substituted.

+3  A: 

Using prepared statements :

  • When you prepare the statement, it is sent to the MySQL server
  • When you bind the variables + execute the statement, only the variables are sent to the MySQL server
  • And the statement + bound variables are executed on the MySQL server -- without it re-doing the "preparation" each time the statement is executed (which is why prepared statements can be good for performances when the same statement is executed several times)

There is no "building" of an SQL query on the PHP side ; so, there is no way to actually get that query.


Which means that if you want to see an SQL query, you have to use... Well, SQL queries, and not prepared statements.

Pascal MARTIN
well thats a little annoying =\ You'd think there's be a way to fetch the executed statement
Stomped
If you need this on the PHP side, mainly for debugging reasons, I suppose, you could "re-construct" the SQL query that's equivalent to the execution of the statement : you'll have to replace the placeholders by the values of the variables *(escaping the data, of course, will be left to you)* ;;; if you need this often, you should be able to write a function that does this for you ; else, a couple of `var_dump` should already help you see what data is sent to the MySQL server.
Pascal MARTIN
@stomped The point is that there is no executed statement. That step is skipped entirely.
troelskn
A: 

Agreeing with Pascal MARTIN (+1) so I suggest another technique for debugging: var_dump() or log every variable you're inserting into the statement, that way you should be able to figure out if it is wrong data or logically wrong SQL.

chelmertz
+1  A: 
For prepared statements that are executed with the mysql_stmt_prepare() and mysql_stmt_execute() C API functions, the server writes Prepare and Execute lines to the general query log so that you can tell when statements are prepared and executed.
[...] the server writes the following lines to the general query log:
Prepare [1] SELECT ?
Execute [1] SELECT 3

So for debugging purposes active the general log and keep an eye on that file.

edit: oh, the question has a [mysqli] tag... completely overlooked that.
If the statement isn't executed at all have you (double/tripple) checked that no error occurred along the way?

echo "<pre>Debug: start</pre>\n";

$mysqli = new mysqli('localhost', 'localonly', 'localonly', 'test');
if ($mysqli->connect_error) {
  die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}

$result = $mysqli->query('CREATE TEMPORARY TABLE foo (id int auto_increment, x int, primary key(id))');
if ( false=== $result) { 
 die('error : '. $mysqli->error);
}

$stmt = $mysqli->prepare('INSERT INTO foo (x) VALUES (?)');
if ( false===$stmt ) {
  die ('prepare() failed: ' . $mysqli->error);
}

$result = $stmt->bind_param('i', $x);
if ( false===$result ) {
  die('bind_param() failed');
}

$x = 1;
$result = $stmt->execute();
if ( false===$result ) {
  die('execute() failed: '.$stmt->error);
}

echo "<pre>Debug: end</pre>\n";
VolkerK