php准备好的陈述 - 新手

时间:2011-12-03 15:23:00

标签: php mysqli

我试图使用mysqli prepared语句在一组值中插入一个表调用日志。我有2个函数save_timecard_entry,如果我使用所有POST数据插入没有问题。 但是我有第二个函数,我试图从另一个名为clients的表中查找id,然后使用此id插入第一个表。 似乎无法让它工作

$this->conn = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) etc.....

function save_timecard_entry(){
    if(isset($_POST['submit'])){
        $date = $_POST['date'];
        $client = fetch_id($_POST['client']);
        $job = $_POST['job'];
        $task = $_POST['task'];
        $time = $_POST['time'];
        $username = 2;

        $query = "INSERT INTO log VALUES (NULL,?,?,?,?,?,?)";

        if($stmt = $this->conn->prepare($query)){
            $stmt->bind_param('siiiii', $date, $client, $job, $task, $time, $username);
            $stmt->execute();
            $stmt->close();
        }
    } else{
        echo 'error' . $this->conn->error;
    }


}

function fetch_id($name){
    if($stmt = $this->conn->prepare("SELECT id, FROM clients WHERE name =?")){
        $stmt->bind_param("ss", $name);
        $stmt->execute();
        $stmt->bind_result($id);
        $stmt->fetch();
        return $id;
        $stmt->close;
    } 
}

4 个答案:

答案 0 :(得分:1)

只有一个参数需要绑定,但是你传递的是一个包含2个字母的数据类型字符串。

正确的bind_param电话:

$stmt->bind_param('s', $name);

我也会进行某种错误检查,$stmt->bind_param()很可能返回false,您可能希望在实际执行查询之前检查它。

答案 1 :(得分:0)

没有执行它,但是在“id”之后有一个逗号,为了按预期工作,必须从查询中删除它:

    if ($stmt = $this->conn->prepare("SELECT id FROM clients WHERE name = ?")) {

答案 2 :(得分:0)

我看到一些问题,其中一个问题已被提及。在第二个查询中,您绑定了两个字符串变量“ss”,但在查询中只有一个变量。

此外,在第一个查询中,您将参数绑定为“siiiii”。这是一个字符串,后跟五个整数。但是,您的一个参数是$ time的值,您显然是从表单发布的。如何在表单中生成$ time变量? Php time()返回一个整数,但是如果你允许人们在表单中输入11:30 pm之类的时间,那么这将是一个字符串而不是一个整数。如果您尝试将字符串绑定为整数,则查询将无法正常工作。

答案 3 :(得分:-2)

你不能那样使用PDOStatement->bindParam。如果您想一次绑定所有参数,可以使用PDOStatement->execute代替,因为它需要带有参数的数组:

$stm->execute(array($date, $client, $job, $task, $time, $username));