2009-11-04 48 views
7

就像往常一樣,我正在四處尋找PHP的最佳實踐,並且準備好的語句似乎是我現在應該如何閉上眼睛的東西。所以我開始玩弄一些我發現的例子。mysqli Prepared Statement in bindParam()不起作用

運行腳本時,我得到這個錯誤:

Fatal error: Call to a member function bindParam() on a non-object in /opt/lampp/htdocs/phpSecurity/PreparedStatments/Insert-Multi-Binded-Params/Insert Simple Method.php on line 10

這裏是不言而喻的代碼。

插入簡單Method.php

<?php 
require_once '../config.php'; 

$stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)"); 

$nome = 'Fabio Antunes'; 
$telefone = 916810641; 
$bi = 123093456; 

$stmt->bindParam(1, $nome); 
$stmt->bindParam(2, $telefone); 
$stmt->bindParam(3, $bi); 

$stmt->execute(); 

$stmt->close(); 

$db->close(); 
?> 

的config.php

<?php 
$server_host = 'localhost'; 
$server_user = 'root'; 
$server_password = ''; 
$server_db = 'PreparedStatements'; 
$db = new mysqli($server_host, $server_user, $server_password, $server_db); 
?> 

不知道我在做什麼錯在這裏,這是在php.net找到類似的例子,爲什麼不工作? PS:我認爲mysqli連接不是問題,因爲我用它來用SELECT SQL命令做一些準備好的語句。並且工作得很好。


編輯

分辨率和原因。

那麼在example我應該使用bind_param()爲查詢中的每個值。但是,感謝Bart,他設法用我的代碼解決了這個問題。

在哪裏,它是:

$stmt->bindParam(1, $nome); 
$stmt->bindParam(2, $telefone); 
$stmt->bindParam(3, $bi); 

它應該是:

$stmt->bind_param("sii", $nome, $telefone, $bi); 

現在對於那些誰可能想知道什麼是 「SII」。

那麼bind_param爲我看到它綁定到每個問號「?」的「$ var」爲了。

所以有一個bind_param()我可以同時綁定它們,正常使用bind_param()需要指定綁定數據的類型。

我要綁定的第一個值是$nome一個字符串,由「s」指定;

其他$telefone$bi是整數,因爲他有「我」;

對於其他有類似問題的人來說,這裏還有其他數據類型(來自php.net)。

i = Integer;

s = String;

d = Double;

b = Blob;

如果有人作爲更好的解釋請發佈或評論。所以我可以改進我自己的。

謝謝。

回答

6

你可能會覺得有什麼不妥的連接,但你應該檢查,以確保:

$db = new mysqli($server_host, $server_user, $server_password, $server_db); 
if (mysqli_connect_errno()) { 
    printf("DB error: %s", mysqli_connect_error()); 
    exit(); 
} 

編輯:

當你這樣做會發生什麼:

$stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)"); 
$stmt->bind_param("sii", $nome, $telefone, $bi); 
$stmt->execute(); 

coisas拼寫正確嗎?

+0

良好的最佳實踐建議。我試過了,但沒有解決問題。任何其他想法? – 2009-11-04 21:36:47

+0

$ stmt-> bind_param(「sii」,$ nome,$ telefone,$ bi);工作。 – 2009-11-04 21:45:22

+0

很高興聽到它法比歐。 – 2009-11-04 21:46:23

2

在$ stmt上做一個print_r後,你將它返回到第4行。它是一個真正的對象嗎?我猜不。

+0

不知道那會做什麼,但。問題是我爲每個值使用綁定參數,我只能使用一個,而我沒有提到值輸入類型(s = string | i = integer)。不管怎麼說,還是要謝謝你。 – 2009-11-04 21:46:57

+0

該錯誤表明您正在調用某個方法的對象($ stmt)實際上並不是一個對象。這可能在該方法中發生,但我的第一個猜測是它首先是空的$ stmt。 – Zak 2009-11-04 22:10:57

相關問題