Re: Prepared Statements - Select - Bind Parameters w/ correction

Matt Pelmear <[email protected]>
Newsgroups gmane.comp.php.database
Message-ID <[email protected]>
Ethan,

Please accept my apologies for the minor errors in the untested code I 
previously provided for your edification.
Consider the following tested code:

<?php
/*
     CREATE TABLE test (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, data 
INT UNSIGNED);
     INSERT INTO test (data) VALUES (123),(124),(125);
*/

     // Faking a POST for testing
     $_POST = array(
         'id' => "1",
         'data' => "123"
     );

     // Don't forget to put your mysql configuration here
     $mysql_host = 'localhost';
     $mysql_user = 'user';
     $mysql_password = 'password';
     $mysql_database = 'test';
     $dbh = mysqli_connect( $mysql_host, $mysql_user, $mysql_password, 
$database );
     if( !$dbh )
         die( 'Connect failed: ' . mysqli_connect_error() . PHP_EOL );

     // Configure the query and the acceptable params to put into the 
WHERE clause
     $q = 'SELECT * FROM test WHERE 1';
     $allowed_fields = array(
         'data' => 'i',
         'id' => 'i'
     );

     // Magically put everything together
     $types = '';
     $args = array();
     foreach( $allowed_fields as $k => $type )
     {
         if( !array_key_exists( $k, $_POST ) )
             continue;

         $args[] = &$_POST[$k]; // Note the addition of the ampersand here
         $types .= $type;
         $q .= " AND ($k = ?)";
     }

     // For debugging and demonstration
     echo 'Query: ' . $q . PHP_EOL;
     echo 'Bind types: ' . $types . PHP_EOL;
     echo 'Arguments:' . PHP_EOL;
     print_r($args);

     $stmt = mysqli_prepare( $dbh, $q );
     if( !$stmt )
         throw new Exception( 'Error preparing statement' );

     // Put the statement and types variables at the front of the params 
to pass to mysqli_stmt_bind_param()
     array_unshift( $args, $stmt, $types ); // Note that I've moved this 
call. Apparently it doesn't pass back the result. I guess sometimes I 
just forget these things.

     // mysqli_stmt_bind_param()
     if( !call_user_func_array( 'mysqli_stmt_bind_param', $args ) )
         throw new Exception( 'Failed calling mysqli_stmt_bind_param' );

     if( !mysqli_stmt_execute( $stmt ) )
         throw new Exception( 'Error while executing statement' );
     mysqli_stmt_bind_result( $stmt, $id, $data );

     while( mysqli_stmt_fetch($stmt) )
         printf( "%d %d\n", $id, $data );

     mysqli_stmt_close( $stmt );
     mysqli_close( $dbh );

/////// end code snippet


I would recommend you consider Jim Giner's remarks as well. PHP's error 
message was giving you exactly what you needed to solve the problem with 
the code I gave you. There is even a note about using 
call_user_func_array() in the documentation about 
mysqli_stmt_bind_param(). In fact, the first example in the comments on 
the mysql_stmt_bind_param() page shows one way of solving the issue you 
are having. (http://php.net/manual/en/mysqli-stmt.bind-param.php)

I think you will find people a lot more willing to help if you can show 
that you've done basic research like looking at the documentation for 
the function you are trying to use :-)

If you don't understand references, I would recommend reading about 
them: http://php.net/manual/en/language.references.php


-Matt

On 09/27/2012 09:40 AM, Ethan Rosenberg, PhD wrote:
> Dear list -
>
> SEE CORRECTION IN $_POST VARIABLE BELOW.
>
> Thanks to all for your help.
>
> I hope [??] that this question will solve all the remaining problems.
>
> So that we are on the same page, here is what was previously stated.
>
> mysqli_stmt_bind_param expects three variables, in this order ---- 
> mysqli_stmt_bind_param($stmt, "num", $a, $b, $c)
>     Where stmt is the query w/ the ?? that is
>
> SELECT Site, MedRec, Fname, Lname, Phone, Height, Sex, Hx, Bday, Age 
> FROM Intake3 where  1  AND (Site  = ?)  AND (MedRec  = ?)  AND (Sex  = ?)
>  and num is the number and  type of variables is the query, in this 
> case 'sis'
>
> $a $b and $c are the variables to be inserted, in this case:
>     $a = $_POST['Site'];
>     $b = $_POST['MedRec'];
>     $c = $_POST['Sex'];
>
> As I seem to have found, the variables cannot be a string or 
> components of an imploded array.
>
> This is a search function that will take patient supplied data and 
> search the Intake database to determine the Medical Record Number.
> There are nine variables in the database, and I never know which 
> variables the patient will give.
>
> Based on the database, it is easy to set up the correspondence. The 
> database is searched in the order of the correspondence and the 
> letters can be
> immediately determined...
>
>
>    $a = $_POST['Site']
>
>    $b = $_POST['MedRec']
>
>    $c = $_POST['Fname']
>
>    $d = $_POST['Lname']
>
>    $e = $_POST['Phone']
>
>    $f = $_POST[Height']
>
>    $g = $_POST['Sex']
>
>    $h = $_POST['Hx']
>
>    $i = $_POST['Bday']
>
>    $i = $_POST['Age']  <----- Corrected
>
>
> The challenge is to be able to dynamically select the variables that 
> will go intomysqli_stmt_bind_param.
>
> Advice and help, please
>
>
> Ethan
>


-- 
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.