Готовая выписка с реляционной базой данных - PullRequest
0 голосов
/ 15 июля 2011

Я мог бы использовать некоторую справку о том, как изменить этот запрос

$query = mysql_query("SELECT M.msg_id, M.uid_fk, M.message, M.created, U.username FROM messages M, users U  WHERE M.uid_fk=U.uid and M.uid_fk='$uid' order by M.msg_id desc ")

в подготовленное заявление. Я не уверен, что пойдет в mysqli_stmt_bind_param (). Это то, что я до сих пор:

$stmt = mysqli_prepare($link, "SELECT M.msg_id, M.uid_fk, M.message, M.created, U.username FROM messages M, users U  WHERE M.uid_fk=? and M.uid_fk=? order by M.msg_id desc")) {


mysqli_stmt_bind_param($stmt, "s,s", $uid,$uid); 

Я знаю, что $ uid, $ uid неверны, как изменить M.uid_fk = U.uid и M.uid_fk = '$ uid для работы в bind_para.

Спасибо

1 Ответ

2 голосов
/ 16 июля 2011

Вам нужно только связать то, что вы на самом деле планируете передать, чтобы ваш запрос остался практически таким же:

$stmt = mysqli_prepare("SELECT M.msg_id, M.uid_fk, M.message, M.created, U.username FROM messages M, users U  WHERE M.uid_fk=U.uid and M.uid_fk= ? order by M.msg_id desc");

mysqli_stmt_bind_param($stmt, "s", $uid);

Кроме того, если у вас несколько параметров, типы привязки не разделяются запятой, поэтому, если это будет выглядеть так:

 mysqli_stmt_bind_param($stmt, "sss", $uid, $someString, $someOtherString);

Наконец, если вам действительно нужно использовать PDO. С Mysqli работать намного сложнее, особенно с готовыми заявлениями. Например, это пример подготовленного оператора из руководства php.net:

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query = "SELECT Name, CountryCode FROM City WHERE CountryCode = ? ORDER by ID DESC LIMIT 150,5";

// you can only bind by reference so we have to do this... and it gets really annoying!
$code = 'US'; 

if ($stmt = $mysqli->prepare($query)) {

    $stmt->bind_param($stmt, 's', $code);

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

    /* bind result variables  - we have to do this as well with is really annoying! */
    $stmt->bind_result($name, $code);

    /* fetch values */
    while ($stmt->fetch()) {
        printf ("%s (%s)\n", $name, $code);
    }

    /* close statement */
    $stmt->close();
}

И сделать то же самое с PDO:

try {

  $pdo = new PDO("mysql:host=localhost;dbname=mydb", "my_user", "my_password");
} catch(PDOException $e) {
  printf("Connect failed: %s\n", $e->getCode());
  exit();
}

$query = "SELECT Name, CountryCode FROM City WHERE CountryCode = ? ORDER by ID DESC LIMIT 150,5";

    // when you call prepare you can bind all the vairables immediately
    // or you can do it ehn you call PDOStatement::execute()

    if ($stmt = $pdo->prepare($query, array('US')) {


        /* execute statement */
        // if we wanted to bind params at execution time we could use
        // $pdo->execute(array('US'));
        $stmt->execute();


        /* fetch values */
        while (false !== ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            printf ("%s (%s)\n", $row['Name'], $row['Code']);
        }

        /* close statement */
        $stmt->close();
    }

Теперь, если вам нравится привязка к ссылочным переменным для результатов или параметров, вы все равно можете сделать это с помощью PDO, но я считаю, что намного проще и гибче этого не делать. Так что на самом деле речь идет о гибкости. Вы можете использовать простую процедуру для простых вещей или более сложную процедуру, когда это необходимо.

...