2013-10-09 38 views
0

我一直坐在同样的小问题现在超过10个小时,所以现在是时候问stackoverflow!我已连接到数据库,但在调用mysqli_stmt_bind_param时,我得到“无效的对象或资源”。PHP连接到db无法使用插入功能

我试着在控制台中插入语句,它工作正常..

<?php 
    $con=mysqli_connect("127.0.0.1:3306", "myUsername", "password"); 
    mysqli_select_db($con, "webshop"); 

    if (mysqli_connect_errno($con)) 
    { 
     echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

    $query= mysqli_stmt_init($con); 

    mysqli_stmt_prepare($query, "INSERT INTO user (name, email, hash, address, tel) VALUES (?, ?, ?, ?, ?)"); 
    mysqli_stmt_bind_param($query, "ssssi", $name, $email, $hash, $address, $tel); 
    if(mysqli_stmt_execute($query)) 
    { 
     mysqli_close($con); 
    } 

?> 

感谢任何帮助了!

回答

0

mysqli_stmt_init是需要的,因为你正在使用程序风格访问mysqli。

这将返回一个类型为mysqli_stmt的对象,该对象将作为您正在构建的查询的容器。因此,您应该将此作为第一个参数传递给mysqli_stmt_preparemysqli_stmt_bind_parammysqli_stmt_execute

所以,你的代码看起来像:

<?php 
    $con=mysqli_connect("127.0.0.1:3306", "myUsername", "password"); 
    mysqli_select_db($con, "webshop"); 

    if (mysqli_connect_errno($con)) 
    { 
     echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

    $stmt = mysqli_stmt_init($con); 
    $query = "INSERT INTO user (name, email, hash, address, tel) VALUES (?, ?, ?, ?, ?)"; 

    mysqli_stmt_prepare($stmt, $query); 
    mysqli_stmt_bind_param($stmt, "ssssi", $name, $email, $hash, $address, $tel); 
    if(mysqli_stmt_execute($stmt)) 
    { 
     mysqli_close($stmt); 
    } 

?> 

一个不相关的点 - 你似乎是要求你tel场(这我相信是一个电话号码)是一个整数。如果您必须处理从0开始的电话号码(例如在英国常见),那么这可能是一个糟糕的主意。

+0

是的,这是正确使用mysqli的方法。这与我最初的解决方案有点相似。我遇到的问题不是这段代码,而是我用的用户没有权限访问插入。这很难找到。 –

2

你必须mysqli_stmt_prepare()

$stmt = mysqli_stmt_prepare($con, "INSERT INTO user (name, email, hash, address, tel) VALUES (?, ?, ?, ?, ?)"); 
mysqli_stmt_bind_param($stmt, "ssssi", $name, $email, $hash, $address, $tel); 
if(mysqli_stmt_execute($stmt)) 

而且,不需要mysqli_stmt_init($con)调用(我认为)使用返回的Statement对象。

+0

如果我擦除init函数,然后准备出现错误“期望参数1为mysqli_stmt,给定的对象”。这是否告诉我连接有问题? 无论如何,如果我保持初始化并在param中使用新的$ stmt,我会得到“期望参数1为mysqli_stmt,布尔给定”。所以我想$ stmt返回false,但为什么。 –

+0

'echo mysqli_error()'可能会给你一些线索 –