当前位置: 首页 > 知识库问答 >
问题:

PHPs mysqli准备-动态生成

庾奇思
2023-03-14

我生成SQL语句的代码工作正常-但是我在为$stmt生成字符串时遇到了一个问题-

$stmt=$mysqli-

    if ($action == 'insert' || $action == 'update') {
        reset ($array);
        foreach ($array as $key => $value) {
            if (is_string ($value)) { $type = 's'; } else if (is_int ($value)) { $type = 'i'; } else if (is_float ($value)) { $type = 'd'; } else { die ('Cannot determine type for ' . $key . ' => ' . $value . ''); }
            $bind_types .= $type;
            $bind_values .= $value . ', ';
            //$stmt->bind_param ($type, $value);
        }
    }

    if ($action == 'update' || $action == 'delete') {
        if (is_string ($id_value)) { $type = 's'; } else if (is_int ($id_value)) { $type = 'i'; } else if (is_float ($id_value)) { $type = 'd'; } else { die ('Cannot determine type for ' . $id_column . ' => ' . $id_value . ''); }
        $bind_types .= $type;
        $bind_values .= $id_value . ', ';
        //$stmt->bind_param ($type, $id_value);
    }

    $bind_types .= '"';

    $bind_values = substr ($bind_values, 0, -2);

    echo $bind_types  . ', ' . $bind_values;

    $stmt->bind_param ($bind_types, $bind_values);
    $stmt->execute();

}

它的格式搞砸了。如果很难读,我道歉。

我得到以下错误:

"警告:mysqli_stmt::bind_param()[mysqli-stmt.bind-参数]:类型定义字符串中的元素数与..."

有什么想法吗?


共有2个答案

谢铭
2023-03-14

您对bind_param的调用是错误的:应该是:

bind_param($types, $value1, $value2, $value3 ...);

其中每个值都是一个实际变量。

岳池暝
2023-03-14

我强烈建议使用PDO,因为你可以很容易地做到这一点。如果你想在mysqli中做这件事,那就更复杂了,因为你不能轻松地动态绑定它们。动态绑定它们看看这个丑陋的黑客

$bind_values= explode(',', $bind_values);
call_user_func_array(array($stmt, 'bind_param'), makeValuesReferenced($bind_values));
$stmt->execute();

function makeValuesReferenced(&$arr){ 
    $refs = array(); 
    foreach($arr as $key => $value) 
        $refs[$key] = &$arr[$key]; 
    return $refs; 

}
 类似资料:
  • 我是新手,请放心。目前,我正在使用放心的API自动化。我有以下方案要处理 我们有两个 API(例如:API1、API2),API1 会给出用户详细信息的列表。我需要将这些详细信息作为第二个 API 请求的一部分发送。 API1 -响应 API2 -请求:。:在API2请求中,我需要发送“sourceUserId”和“source”详细信息。 userSourceMeta详细信息会根据用户动态变化。

  • 问题内容: 我有以下带有四个参数的存储过程。 存储过程: 好吧,我正在这样准备: 这是一个正确的方式 或 有没有更好的方式来准备动态条款? 问题答案: 这就是所谓的全部查询,它基本上是这样的:

  • 本书大部分篇幅会用来关注MongoDB的核心功能。所以我们基本上使用的是MongoDB的外壳(shell)。shell在学习MongoDB还有管理数据库的时候很有用,不过您的实际代码还是会用相应的语言来驱动mongoDB的。 这也引出了关于MongoDB您首先需要了解的东西:它的驱动。MongoDB有许多针对不同语言的官方驱动。可以认为这些驱动和您所熟知的各种数据库驱动是一样的。基于这些驱动,Mo

  • 先去准备,下载,安装几个东西。 命令行 使用 Vagrant,几乎都是在命令行下进行的,所以你需要先准备一个命令行界面。Windows 用户我推荐使用完整版的 cmder,macOS 用户可以使用系统自带的终端(Terminal)。 Windows 下载 cmder: https://github.com/cmderdev/cmder 虚拟机 选择一款虚拟机软件,Virtualbox,VMWare

  • 学习 CentOS,你需要一台安装了这种操作系统的机器,可以是一台真正的服务器,也可以是在本地电脑上创建的一台 CentOS 的虚拟机。Vagrant 入门教程 这本书里介绍了在本地管理虚拟机的方法。 虚拟机 创建一台 CentOS 系统的虚拟机。打开命令行,执行: cd ~/desktop mkdir wenjiangs-centos cd wenjiangs-centos vagrant

  • 问题内容: 我正在尝试创建一个数据库查询函数,该函数可以采用多个参数并可以在其他地方重用,但是我尝试了许多与我的方法类似的在线方法,但它们无法按预期工作。 我希望能够使用此单个函数随时随地运行查询,使用PDO驱动程序这种类型的函数要容易得多,因为您只需在内部输入绑定即可,但是在这种情况下,我不得不立即将MySQLi用作应用程序依赖它,但想要升级它以使用准备好的语句。 我需要如何使用该函数以确保其可