Вам нужно только связать то, что вы на самом деле планируете передать, чтобы ваш запрос остался практически таким же:
$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, но я считаю, что намного проще и гибче этого не делать. Так что на самом деле речь идет о гибкости. Вы можете использовать простую процедуру для простых вещей или более сложную процедуру, когда это необходимо.