2012-08-15 55 views
2

我已經將我的很多舊版本的MySQL的東西的MySQLi在PHP和我在下面的代碼得到一個問題:PHP的mysqli prepare語句未能返回行

### FETCH INCLUDES ### 
$player=$_POST['player']; 
$password=md5($_POST['password']); 
#### DB CONNECTION #### 
if(!$mysqli=new mysqli(DBHOST,DBUSER,DBPWD,DBNAME)) {$err=$mysqli->error; print($err); } 
$sql="SELECT * FROM accounts WHERE name='?' AND passkey='?'"; 
if($stmt=$mysqli->prepare($sql)) { 
    //$stmt->bind_param('ss',$player,$password); 
    $stmt->execute(); 
    $stmt->store_result(); 
    if($stmt->num_rows==1) { 
     $account=$stmt->fetch_assoc(); 
     // purely for debugging 
     print_r($account); 
     if($_SESSION['account']=$account) $account=true; 
    } else { 
     echo "Failed. Row count: "; 
     print($stmt->num_rows); 
     echo "<br />"; 
     $query=str_replace('?','%s',$sql); 
     printf($query,$player,$password); 
     $account=false; 
    } 
    $stmt->close(); 
} else { 
    $err=$mysqli->error; 
    print($err); 
} 

我已經故障範圍縮小到查詢本身。我得到0行返回,沒有錯誤,所以我想我會輸出查詢(str_replace事情我去那裏),我可以使用查詢返回從PHPMyAdmin使用相同的查詢從數據庫中的一行

我哪裏錯了?

編輯

我試圖改變查詢到一個基本的沒有約束力的PARAMS - 「SELECT * FROM表」 仍然沒有得到返回的行。所以這不是查詢本身,它會在我的順序/格式的準備,執行情況

秒編輯:我已經添加了$ stmt-> store_result()代碼,仍然返回0行數。

第三編輯: 我調查了看起來很好的連接和用戶設置。我可以使用相同的用戶和密碼通過控制檯連接到數據庫,並且數據庫名稱相同。我真的難倒這個:(

+0

不是一個答案,但請不要使用md5來散列密碼。它完全破碎。看看bcrypt,你也可能想閱讀salting密碼。 – PeeHaa 2012-08-15 22:54:49

+0

你確定有匹配的行嗎?你是否嘗試過'echo'聲明和值並手動運行查詢? – PeeHaa 2012-08-15 22:57:17

+0

是的,這就是printf的用途,輸出它正在運行的確切查詢,並返回行。我正在嘗試其他一些東西。我認爲這可能與某種準備/執行步驟有關我缺少 – elzaer 2012-08-15 23:00:14

回答

3

添加$stmt->store_result();$stmt->execute();後,因爲它似乎的必須調用一次之前$stmt->num_rows ......至少他們這樣做的例子(見http://php.net/manual/en/mysqli-stmt.store-result.php)。他們在meantion依賴「num_rows」的文檔

其他想法:你檢查if($stmt->num_rows==1) {,你確定num_rows是0嗎?我不知道你的數據庫結構爲「accounts」表。「name」是主鍵至少有一個唯一的索引)?如果沒有,可能會有多個匹配的列,這只是一個快速的想法,可能是錯誤的,並且會導致您在源代碼中尋找幾個小時來解決問題,而問題在其他地方。

+0

增加了store_result(),仍然得到相同的結果。我編輯了代碼,正如你所看到的,我運行一個調試來顯示返回的行數是0,而不管我運行的是什麼查詢。我試過「SELECT * FROM accounts」,它也返回0行數,這讓我覺得在DB選擇或類似的事情中可能存在問題。這很奇怪,但當我試圖將它改變爲不存在的東西時,我會遇到連接錯誤,所以我真的很困惑。 – elzaer 2012-08-15 23:37:27

+0

你能以某種方式執行服務器上的調試輸出查詢(例如,通過mysql客戶端或phpmyAdmin?)。只是看,天氣這給結果行......注意,你當然需要在你的字符串周圍添加'...'。 – SDwarfs 2012-08-15 23:44:02

+0

是的,這就是爲什麼我在printf($ query ...)行中添加的,所以我很容易運行它的服務器端。正如我所說,這不是查詢。當我在服務器上運行它時,查詢將完全返回我想要的內容。無論我在那裏放什麼查詢,它總是返回0行數 – elzaer 2012-08-15 23:46:22

0

我得到它的工作,我最終需要$ stmt-> store_result();

但我也注意到我已經在單引號附加了?在導致問題的準備聲明中。

在store_result方法中使用這些方法後,它就可以工作了!

1

好吧,我沒有檢查你的代碼。首先,您應該在連接時修復錯誤處理。不檢查「$ mysqli的」是事實,但檢查mysqli_connect_errno()這樣的:

$mysqli=new mysqli(DBHOST,DBUSER,DBPWD,DBNAME); 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

我的服務器上的代碼與正確的憑據工作(如DBHOST,DBUSER,DBPWD,DBNAME需要更換) 。

而聲明$account=$stmt->fetch_assoc();不起作用。 $ stmt對象中沒有fetch_assoc()函數。 fetch_assoc()用於通過使用普通查詢(未準備好的語句)獲得的mysqli :: result對象。你需要使用$ stmt-> bind_result();然後$ stmt-> fetch();此外,你應該把所有列名稱的查詢而不是「*」,這就定義了一個字段順序...

+0

fetch_assoc確實需要修復,但至少返回的結果很容易調整,並從那裏模製! – elzaer 2012-08-16 00:17:22

+0

我可以使用bind_result將3列數組綁定到一個cariable上嗎?因此,如果我在查詢中選擇了我想要的列,並將它們全部綁定到可變值列表中,它是否會成爲關聯數組? – elzaer 2012-08-16 00:20:56

+0

不,但你可以嘗試綁定到多個子元素...到$ data [「x」]和$ data [「y」]和$ data [「z」]等等... mysqli不是很靈活在這裏。也許「PDO」更好:請參閱http://de2.php.net/manual/de/pdostatement.fetchobject.php和http://de2.php.net/manual/de/book.pdo.php;到目前爲止還沒有嘗試過......只是看了文檔。 – SDwarfs 2012-08-16 10:47:45