首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将查询转换为预准备语句

将查询转换为预准备语句
EN

Stack Overflow用户
提问于 2014-09-11 23:08:59
回答 1查看 119关注 0票数 0

我已经尝试了几个小时了,但没有成功。

我们有这样的查询

代码语言:javascript
复制
$commercial_name = strip_tags($_POST['commercial_beer']);    
$q = "SELECT bb_comm_id FROM bb_commercial WHERE bb_comm_name = '" . $commercial_name . "'";    
$r = @mysqli_query ($dbc, $q); // Run the query.
$row = @mysqli_fetch_array ($r, MYSQLI_ASSOC);
$comm_id = $row['bb_comm_id'];

它工作得很好。我正在尝试使用准备好的语句,并提出了以下建议

代码语言:javascript
复制
$commercial_name = strip_tags($_POST['commercial_beer']);   
$q = "SELECT bb_comm_id FROM bb_commercial WHERE bb_comm_name = ?"; 
$stmt = mysqli_prepare($dbc, $q);
mysqli_stmt_bind_param($stmt, 'i', $commercial_name);
$r = mysqli_stmt_execute($stmt);
$row = @mysqli_fetch_array ($r, MYSQLI_ASSOC);
$comm_id = $row['bb_comm_id'];

这不管用。我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2014-09-11 23:20:29

由于不太清楚您的问题是什么,我将分享我用来调试数据库查询的代码。我甚至会将其简化为您的代码。

代码语言:javascript
复制
$commercial_name = strip_tags($_POST['commercial_beer']);
if($stmt=$dbc->prepare("SELECT bb_comm_id FROM bb_commercial WHERE bb_comm_name = ?")){
    if (!$stmt->bind_param("s", $commercial_name)) {
        echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
    }
    if (!$stmt->execute()) {
        echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
    }
    $meta = $stmt->result_metadata();
    while ($field = $meta->fetch_field()) {
        $parameters[] = &$row[$field->name];
    }
    call_user_func_array(array($stmt, 'bind_result'), $parameters);
    while ($stmt->fetch()) {
        foreach($row as $key => $val) {
            $x[$key] = $val;
        }
        $comm_id[] = $x;
    }
    $stmt->close();
}else{
    echo "Prepare failed: (" . $dbc->errno . ") " . $dbc->error;
}

此代码将报告每一步是否发生错误,并将结果集中的所有行保存在$comm_id中。

试试看,如果还有问题,请告诉我。

另外,我认为$commercial_name之前的字符应该是"s"而不是"i",因为它应该是一个字符串,而不是一个整数。

一个更“生产就绪”的版本:

代码语言:javascript
复制
$stmt=$dbc->prepare("SELECT bb_comm_id FROM bb_commercial WHERE bb_comm_name = ?");
    $stmt->bind_param("s", $commercial_name);
    $stmt->execute();
    $meta = $stmt->result_metadata();
    while ($field = $meta->fetch_field()) {
        $parameters[] = &$row[$field->name];
    }
    call_user_func_array(array($stmt, 'bind_result'), $parameters);
    while ($stmt->fetch()) {
        foreach($row as $key => $val) {
            $x[$key] = $val;
        }
        $comm_id[] = $x;
    }
$stmt->close();

之后,您可以从$comm_id获取行,例如,第一个结果将存储在$comm_id[0]["bb_comm_id"]

或者,如果您希望只有一行作为答案:

代码语言:javascript
复制
$stmt=$con->prepare("SELECT bb_comm_id FROM bb_commercial WHERE bb_comm_name = ?");
$stmt->bind_param("s", $commercial_name);
$stmt->execute();
$stmt->bind_result($comm_id);
$stmt->fetch();
$stmt->close();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25791051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档