2013-07-08 61 views
0

我更改了mysqli中PDO的連接類型。更改mysqli中的PDO

PDO_conection

<?php 
try { 
$pdo = new PDO('mysql:host=localhost;dbname=exercise', 'root', 'root'); 
} catch (PDOException $e){ 
exit('Datebase error.'); 
} 
?> 

mysqli_conection

<?php 
$host = "localhost"; 
$username = "root"; 
$password = "root"; 
$dbname = "exercise"; 
$mysqli = new mysqli($host, $username, $password, $dbname); 
if(mysqli_connect_errno()) { 
echo "Error: Could not connect to database."; 
exit; 
} 
?> 

現在試圖寫在mysqli的PDO的變化的代碼。

PDO_code

$query = $pdo->prepare("SELECT * FROM users WHERE user_name=? AND user_password=? LIMIT 1"); 
     $query->bindValue(1, $username, PDO::PARAM_STR); 
     $query->bindValue(2, $password, PDO::PARAM_STR); 
     $query->execute(); 
     $num = $query->rowCount(); 
     $row = $query->fetch(PDO::FETCH_ASSOC); 

,這是我試圖改變中的mysqli

mysqli_code

$query = $mysqli->prepare("SELECT * FROM users WHERE user_name=? AND user_password=? LIMIT 1"); 
    $query->bind_result($username, $password); 
     $query->execute(); 
     $num = $query->num_rows; 
    $row = $query->fetch_assoc(); 

我哪裏錯了?

+1

這是一個難得的過渡。我很想知道爲什麼會這樣想?除此之外。你的mysqli代碼是錯誤的。你需要得到一個教程和**遵循**它。 –

+0

第一個看起來絕對可怕的「SELECT * FROM users WHERE user_name =?AND user_password =?」,我不打算選擇所有列,但用戶名和密碼選擇看起來真的很陰暗。爲什麼不從用戶的密碼獲取用戶名= post/get username,然後使用php密碼功能進行比較呢?關於主題:你有任何錯誤嗎? – JimL

回答

1

這裏有一個問題:

$query = $mysqli->prepare("SELECT * FROM users WHERE user_name=? AND user_password=? LIMIT 1"); 
$query->bind_result($username, $password);//<== 
$query->execute(); 
$num = $query->num_rows; 
$row = $query->fetch_assoc(); 

連接結果結合傳遞變量到結果集,而你想bind_param

$query->bind_param('ss', $username, $password); 

你仍然必須日之後bind_result使用,而忘記約fetch_assoc。一個mysqli_stmt只有一個fetch方法:

$query->bind_result($id, $field2);//one var per table field... 
while($query->fetch()) 
{ 
    echo $id.', '.$field1; 
} 

我認爲這是很明顯的,爲什麼SELECT *是不被推薦...

而且,爲了保持一致性,改變mysqli_connection_error()if ($mysqli->connect_error)什麼的。 mysqli_*提供程序和OO風格,但請不要混淆兩者。
根據文檔,您不能像YourCommonSense向我指出的那樣使用它,因爲它在PHP 5.2.9和5.3.0之前被破壞。建議保持程序檢查以確保兼容性。

所以在全:

$stmt = $mysqli->prepare('SELECT id FROM users WHER user_name = ? AND user_password = ?'); 
$stmt->bind_param('ss', $username, $password); 
$stmt->execute(); 
$stmt->bind_result($id); 
//or, in your case 
$result = $stmt->get_result(); 
$row = $result->fetch_assoc(); 
$numRows = $result->num_rows; 

使用get_resultsave_resultfree_result ...方法,並從那裏,用mysqli_result比如你從語句獲取,which has all the goodies you're after

+0

我真的不介意,但爲什麼-1? –

+0

請花點時間嘗試運行您編寫的代碼。然後瞭解到你的大部分建議都是錯誤的。 –

+0

@YourCommonSense:好的,夠公平的。我並不太熟悉'mysqli_ *',但我正在用'mysqli_result' ATM嘗試幾件事情。老實說,我不知道,所以一旦我找到更多的東西,我會回到這個答案 –