2013-07-08 487 views
1

我正在嘗試製作一個mysqli prepared語句,並且由於某種原因,至少字符串正在變爲0(零)。MySQLi準備語句插入零

例子:

id - int, PK 
name - varchar(45) 

代碼

if ($stmt = $mysqli->prepare("INSERT INTO test (name) VALUES(?)")){ 
    $stmt->bind_param('s',$name); 
    $name="Test1"; 
    $stmt->execute(); 
} else { 
    echo "prepare failed"; 
} 

如果我運行此,在表中新插入的行會的名稱有0。我究竟做錯了什麼?我無法使用PDO,因爲這樣的服務器沒有它。

+3

你需要使用它*,之前宣佈'$ name' *爲一體。 – ceejayoz

+0

在'bind_param()'之前放''name =「Test1」;' – furas

+0

@coreno我認爲你的問題在其他地方。也許你以後如何檢索行。考慮製作一個簡短/最小完全自包含的腳本(創建表格+插入然後選擇),它可以運行,並將展示問題。很可能,您會在製作該腳本的過程中發現問題。 – goat

回答

-1

有您的代碼一些錯誤的東西:

  • bind_param不上PDOStatement對象存在,但bindParam是的。
  • 當使用名稱綁定參數時,必須在參數前面加入「:」到查詢中。
  • 如果你正在使用?使用索引號碼。
  • 這是可選的,但是您應該使用PDO常量來傳遞參數類型,例如用於字符串的PDO :: PARAM_STR。
  • 最後,你在使用它後定義了你的$ name var,這將不起作用:你必須在使用她之前定義var。

代碼

if ($stmt = $mysqli->prepare("INSERT INTO test (name) VALUES(:name)")){ 
    # defining $name 
    $name = "Test1"; 

    # putting $name to the param :name 
    $stmt->bindParam(":name", $name, PDO::PARAM_STR); 

    # executing the prepared query. 
    $stmt->execute(); 
} else { 
    echo "prepare failed"; 
} 
+1

我想象$ mysqli意味着mysqli擴展,而不是pdo。 – goat

+0

是的,我沒有注意到,但爲什麼使用mysqli時,我們可以使用PDO誰支持12個不同的SQL驅動程序? – barbu

+0

mysqli有一些功能pdo doesnt。另外,你不總是有選擇(現有的代碼)。 – goat