2011-07-15 4 views
0

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

$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.

Благодаря

+0

Как написано, ваш код подвержен SQL-инъекции, если пользователь может контролировать то, что находится в '$ uid'. Одним из основных преимуществ подготовленного оператора с заполнителями является то, что вы больше не подвержены SQL-инъекции - если только вы не выполняете хранимую процедуру, которая выполняет динамический SQL и не использует заполнители. –

ответ

2

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

$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); 

Также не тогда, когда у вас есть несколько Params типы связывания не запятая если это будет выглядеть так:

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

Смежные вопросы