Как сделать параметризованный запрос - PullRequest
1 голос
/ 20 февраля 2010

[Статус: учащийся]

Я пытаюсь реализовать параметризованный запрос, но у меня проблемы. Джонатан Сэмпсон недавно намекнул, как это можно сделать (# 2286115), но я не правильно следую его предложению. Вот мой сценарий

$cGrade = "grade" ;

include_once ( "db_login.php" ) ;

$sql = "SELECT   last_name   AS last_name
               , first_name  AS first_name
               , grade       AS gr
               , ethnic      AS eth
               , sex         AS sex
               , student_id  AS id_num
               , reason      AS reason
               , mon_init    AS since
          FROM t_tims0809
         WHERE tag <> '' AND 
               tag IS NOT NULL AND
               schcode = {$schcode}
         ORDER
            BY ('%s') " ;

$qResult = mysql_query ( sprintf ( $sql, $cGrade ) or ( "Error: " . mysql_error() ) ) ;

Запрос отлично работает с grade во фразе ORDER BY.

Спасибо.

Ответы [ 2 ]

7 голосов
/ 20 февраля 2010

Проверьте подготовленные MySQLi операторы класс:

$query = "INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)";
$stmt = $mysqli->prepare($query);

$stmt->bind_param("sss", $val1, $val2, $val3);

$val1 = 'Stuttgart';
$val2 = 'DEU';
$val3 = 'Baden-Wuerttemberg';

/* Execute the statement */
$stmt->execute();

Из руководства по PHP.

Мне кажется, это намного лучший способ выполнения параметризованных запросов, я переключился на подготовленные операторы, когда это возможно, особенно во время массовых вставок / выборок.

0 голосов
/ 11 августа 2010

Xorlev ответ совершенно правильно. Есть и другие варианты синтаксиса. Вы можете указать переменные связывания в запросе по имени:

$stmt = $mysqli->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();

Или, если вы хотите сделать что-то короткое и пропустить вызов на bindParam():

$stmt = $mysqli->prepare('INSERT INTO tbl VALUES(?)');
$stmt->execute($stmt, array("some input"));
$stmt->execute($stmt, array("some other input"));
$stmt->execute($stmt, array("some more input"));
...