我试图使用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;
}
}
答案 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));