Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将查询转换为准备好的语句_Php_Mysql_Sql_Prepared Statement - Fatal编程技术网

Php 将查询转换为准备好的语句

Php 将查询转换为准备好的语句,php,mysql,sql,prepared-statement,Php,Mysql,Sql,Prepared Statement,我试了几个小时,运气不好 我们有这个疑问 $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_

我试了几个小时,运气不好

我们有这个疑问

$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'];
这很好用。我试着用事先准备好的陈述,并提出了这一点

$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'];

这不管用。我做错了什么

由于不太清楚您的问题是什么,我将与您分享用于调试数据库查询的代码。我甚至会把它删节成你的代码

$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\u id

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

另外,我认为
$commercial\u name
前面的字符应该是
“s”
而不是
“I”
,因为它可能是字符串,而不是整数

更为“生产就绪”的版本:

$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\u id获取行,例如,第一个结果将存储在
$comm\u id[0][“bb\u comm\u id”]

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

$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();

有什么问题?白页?不起作用吗?不执行查询?在参数绑定函数中,将
i
更改为
s
。我假设
$commercial\u name
的值是一个字符串,您指定它是一个
int
。PHP通常不太在意,MySQL有点挑剔为了在StackOverflow上获得最佳结果(或者在任何您需要帮助解决问题的地方),请描述您预期会发生什么,发生了什么,以及您收到了什么错误消息。如果您可以添加关于您试图如何解决问题的任何附加信息,这也会很有帮助。重要提示:不要使用
@
!如果某些东西“不起作用”并且你看不出原因,那么抑制错误就是错误的做法。对不起,PHP和论坛新手。我通过电子邮件收到以下错误第158行的脚本“/home/dowricks/public_html/catalog/view/theme/default/template/information/beer base.tpl”中出现错误:mysqli_fetch_array()预期参数1为mysqli_result,布尔给定日期/时间:2014年11月9日11:27:24@PaulDowrick出现此错误是因为SQL语句无法执行,因此结果是
false
,而不是
resultset
。尝试直接在sql控制台中执行相同的查询;$stmt=$con->prepare(“从bb_commercial中选择bb_comm_id,其中bb_comm_name=?”$stmt->bind_参数(“s”,$commercial_name)$stmt->execute()$stmt->bind_result($comm_id)$stmt->fetch()$stmt->close();并得到了致命错误:对中的非对象调用成员函数prepare()。。。第142行,其中第142行为$stmt=$con->prepare(“从bb_commercial中选择bb_comm_id,其中bb_comm_name=?”;非常感谢Paul@PaulDowrick这意味着查询无法在mysql服务器内执行或返回空结果。准备好的声明正在起作用。你能给出一个最终查询的例子吗,比如从bb_commercial中选择bb_comm_id,其中bb_comm_name='John'从bb_commercial中选择bb_comm_id,其中bb_comm_name=“Woodfordes Wherry”