带有命名占位符的 PDO 准备语句 IN 子句无法按预期工作[重复]

2023-11-30

假设一个场景:$ids = 2,3。但由于某种原因,记录被返回,就像:$ids = 2.

我相信完整代码中的这一行存在一些问题,因为当我回显时$ids,它返回2,3,但实际查询返回时就好像只有一个 id 一样。 IE。它仅返回一门课程(id 2)的事件。

$statement->execute(array("ids" => $ids, 'timestart' => $timestart, 'timeend' => $timeend))) {

我的完整代码:

$ids = array_map(function($item) { return $item->id; }, $entitlementsVOs);
$ids = implode(', ', $ids); //echo shows 2,3

$timestart = isset($_GET['start']) && $_GET['start'] != "" ? $_GET['start'] : null;
$timeend = isset($_GET['end']) && $_GET['end'] != "" ? $_GET['end'] : null;

$statement = $this->connection->prepare("SELECT name AS title, timestart AS start, timestart + timeduration AS end FROM event WHERE courseid IN(:ids) AND timestart >= :timestart AND timestart + timeduration <= :timeend");
$statement->setFetchMode(\PDO::FETCH_CLASS, get_class(new EventVO()));


if($statement->execute(array("ids" => $ids, 'timestart' => $timestart, 'timeend' => $timeend))) {
    return $statement->fetchAll();
} else {
    return null;
}

附注在 mysql 工作台中手动运行此查询返回我的两条记录(一条来自课程 id 2,另一条来自课程 3),我用 (2,3) 替换运算符,但在 php 执行中我只得到一条记录。

如果我在 php 中硬编码这些值courseid IN(2,3), e.g.:

$statement = $this->connection->prepare("SELECT name AS title, timestart AS start, timestart + timeduration AS end FROM event WHERE courseid IN(2,3) AND timestart >= :timestart AND timestart + timeduration <= :timeend");

我得到了我的期望,所以我相信两者都存在一些问题implode, or IN运算符或$statement->execute.

Edit:

我已经读过这个骗局,但我不知道从哪里开始使用命名占位符来完成同样的任务。我的问题是,当我同时命名参数和 IN 运算符时,欺骗者仅将 IN 运算符与位置占位符一起使用。

Edit 2

我已经阅读了第二个骗局,它不相关,我的问题混合使用了 IN 和命名占位符,链接的问题没有解决这个问题,但是,我现在在答案中找到了解决方案。


这应该适合你:

因此,正如注释中已经说过的,您需要为要绑定到 IN 子句中的每个值提供一个占位符。

这里我首先创建数组$ids它只保存普通的 id,例如

[2, 3]

然后我还创建了数组$preparedIds它将占位符保存为数组,稍后您可以在准备好的语句中使用它。这个数组看起来像这样:

[":id2", ":id3"]

我还创建了一个名为的数组$preparedValues其中持有$preparedIds作为钥匙和$ids作为值,您稍后可以将其用于execute()称呼。该数组看起来像这样:

[":id2" => 2, ":id3" => 3]

之后你就可以出发了。在准备好的声明中我只是implode() the $preparedIds数组,因此 SQL 语句如下所示:

... IN(:id2,:id3) ...

然后你可以简单地execute()您的查询。在那里我只是array_merge() your $preparedValues数组与其他占位符数组。

<?php

    $ids = array_map(function($item){
        return $item->id;
    }, $entitlementsVOs);

    $preparedIds = array_map(function($v){
        return ":id$v";
    }, $ids);

    $preparedValues = array_combine($preparedIds, $ids);


    $timestart = (!empty($_GET['start']) ? $_GET['start'] : NULL );
    $timeend = (!empty($_GET['end']) ? $_GET['end'] : NULL );


    $statement = $this->connection->prepare("SELECT name AS title, timestart AS start, timestart + timeduration AS end FROM event WHERE courseid IN(" . implode(",", $preparedIds) . ") AND timestart >= :timestart AND timestart + timeduration <= :timeend");
    $statement->setFetchMode(\PDO::FETCH_CLASS, get_class(new EventVO()));

    if($statement->execute(array_merge($preparedValues, ["timestart" => $timestart, "timeend" => $timeend]))) {
        return $statement->fetchAll();
    } else {
        return null;
    }

?>

另外我认为您想在查询周围放置一个 if 语句,因为如果以下值,您的查询将不会运行$timestart and $timeend为 NULL。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有命名占位符的 PDO 准备语句 IN 子句无法按预期工作[重复] 的相关文章

  • 插入具有多个值的外键

    我想知道 是否有可能创建一个表 其中我有一个接受外键但同一行可能有多个值的表 例如 Employee id name skillid Skill Skillid skillname 这里 Employee 的一个例子可以是 Employee
  • PHP、jQuery 和 Ajax 调用乱序

    我正在使用 jQuery 进行 Ajax 调用 我有 x 数量的 Ajax 调用附加到 div 这些 Ajax 加载请求是由 PHP foreach 循环生成的 问题是它们渲染的顺序不正确 它们被设置在数组中
  • PHP 基本身份验证 file_get_contents() [重复]

    这个问题在这里已经有答案了 我需要从网站解析一些 XML 数据 XML 数据是原始格式 但在我需要进行身份验证之前 基于基本网络服务器的身份验证 使用用户名和密码 I tried homepage file get contents htt
  • 如何处理 AJAX 请求中的会话超时

    我相信你们都熟悉使用 AJAX 的投票系统 嗯 看那边 我有类似的东西 当你投票赞成或反对时 它使用 AJAX 从 votes php 请求新值 问题是我正在使用会话来获取用户 ID 因此一个人只能投票一次 如果他们在页面上坐了一个小时然后
  • 模拟/存根在 PHPUnit 中实现 arrayaccess 的类的对象

    这是我正在为其编写测试套件的类的构造函数 它扩展了 mysqli function construct Config c store config file this gt config c do mysqli constructor pa
  • MySQL Python 关于重复键更新值

    我正在研究使用 python 将 JSON 数据上传到 MySQL 我需要在插入语句中包含 ON DUPLICATE KEY UPDATE VALUES 但在 Python 中遇到了问题 如果我运行以下代码 一切正常 import json
  • oursql 中的参数化查询

    如果有人能告诉我是否可以使用命名占位符进行参数化查询 我将不胜感激oursql 一个用于与 MySQL 数据库交互的 python 模块 例如 我尝试了一种可以与 sqlite3 一起使用的查询 c execute select from
  • 如何让Gmail像加载进度条一样

    我想在页面的中心和顶部创建一个像 Gmail 一样的加载进度条 并适用于所有浏览器 这是基本代码
  • CSS 无法从带有 php“includes”的相对路径工作

    文件夹结构 index php includes header html css style css 我的主项目文件夹中有 2 个子文件夹 一个是名为 includes 的文件夹 另一个名为 css 我有我的 index php主文件夹中的
  • 我怎样才能让这个脚本在 WordPress 上运行?

    我有这个脚本 document ready function text1 click function this hide 代码html div class div1 p class text1 text to appear when th
  • PHP:在脚本完成之前获取输出

    我有一个名为 data php 的脚本 如下所示 do some stuff echo result do some other stuff eg database operations 我需要在另一个脚本中使用 data php 的输出
  • magento成功页面变量

    我正在尝试捕获一些 magento 成功页面变量以传递给我们的广告公司 到目前为止 我已经得到了这个 但变量没有输出任何内容 数据需要采用以下格式 price1 price2 price3 qty1 qty2 qty3 sku1 sku2
  • 简单的dom php解析获取自定义数据属性值

    HTML div class something ddsf PHP foreach dom gt find something data rel as this var dump this gt attr 我尝试了这个但错误 在其文档中找不
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • 使用 fopen() 包装器创建 ZIP 文件

    如何使用以下命令创建 ZIP 文件fopen 包装器 http es php net manual en wrappers compression php 这显然是not道路
  • mysql表中的数据非常大。即使 select 语句也需要很多时间

    我正在开发一个数据库 它是一个相当大的数据库 有 13 亿行和大约 35 列 这是我检查表状态后得到的结果 Name Table Name Engine InnoDB Version 10 Row format Compact Rows 1
  • 无法在 mysql-apt-config [Ubuntu 14.04] 中选择“确定”

    我使用的是 Ubuntu 14 04 sudo apt get update总是给我这个选项来配置 mysql apt config 我尝试选择版本 按 tab gt 在 确定 上突出显示的键 按 Enter 但没有任何反应 它再次返回并突
  • PDO语法错误

    我在一个项目中使用 PDO 但提交时出现语法错误 这是我的代码
  • dbms_xmlgen.getxml - 如何设置日期格式

    我们使用 dbms xmlgen getxml 实用程序通过 SQL 查询生成 xml 该查询从几乎 10 15 个相关表中获取数据 默认情况下 日期格式生成于dd MMM yy格式 有什么方法可以在 dbms xmlgen getxml
  • 如何在查询语句之外从mysql查询中获取值?

    这是下面的函数console log function quo value value connection query SELECT role from roles where id 1 function error results fi

随机推荐

  • Java 中整数到字节的转换

    在Java中我们可以做 byte b 5 但是为什么我们不能将相同的参数传递给接受的函数byte myObject testByte 5 public void testByte byte b System out println Its
  • RESTEasy - 动态添加资源类

    通过 RESTEasy 我实现了 Application 的子类来提供单例资源列表 有没有办法稍后动态添加另一个单例 我还没有从 API 文档中找到实现这一点的方法 我自己没有尝试过 但我找到了一篇博客文章 其中描述了这一点 http sa
  • 在 fltk 窗口内绘制 gnuplot 图形

    我正在编写一个程序 它使用用 fltk 打开的窗口绘制 3D 对象 虽然我真的想在同一个窗口 除了 3D 对象 中添加一些 gnuplot 的图形 因为它们比 OpenGl 的图形更漂亮 那可能吗 我正在致力于模拟对象的运动并用 OpenG
  • 通过进程名称取消隐藏进程?

    前段时间我写了一段代码来隐藏 恢复进程窗口 我所做的是这样的 隐藏进程 1 在正在运行的进程中查找进程名 2 将 MainWindowHandle 添加到容器 在本例中为字典 这对于稍后取消隐藏该进程是必要的 3 使用ShowWindow
  • 如何获取视频的最后一帧?

    我想要视频的最后一帧 我的代码如下所示 let asset AVURLAsset AVURLAsset URL videoURL options nil let generate AVAssetImageGenerator AVAssetI
  • 如果文件已经打开,fopen 是否返回 NULL 指针?

    我当时假设fopen回报NULL指针 如果文件已打开 但看起来fopen不返回NULL如果文件已在以下位置打开 w 模式 下面是我用来尝试此操作的代码 但没有收到任何错误 我尝试使用 mingw32 以及 TDM GCC 64 编译器 如果
  • MVC2:是否有用于原始 Html 的 Html Helper?

    是否有一个 Html 助手可以简单地接受并返回原始 html 而不是做这样丑陋的事情 h2 Results h2 我想做这样的事情 虽然不是很干净 但我认为这是一个进步 存在这样的东西吗 或者是否有比使用 Html 助手更好的替代方法来从这
  • Mysql问题:没有mysql.sock

    昨天我正在使用安装在我的计算机上的 MySQL 进行工作 我下载了xampp 所以我改变了my cnf文件到套接字的路径 opt lampp var mysql mysql sock 该文件就在那里 今天我想继续处理它 我发现该文件不再存在
  • 选择所有行及其在单个查询中的计数

    我有一些名为 items 的表 想要从中获取一些行并在单个查询中计数 全部 现在我正在尝试这样的操作 SELECT COUNT as count SELECT FROM items WHERE as items FROM items 但我得
  • NSDictionary 对象中的非字符串键?

    我已经使用 Foundation 框架中的 NSJSONSerialization 解析了一些 JSON 数据 但是 我得到了 NSDictionary 组的奇怪密钥 如下所示 stop times departure time 5 48a
  • 为什么 SymGetSymFromAddr64 不工作?它返回错误代码 126

    我正在尝试使用以下代码捕获异常的堆栈跟踪 include stdafx h include
  • nls——收敛误差

    对于这个数据集 dat structure list x c 5L 5L 5L 5L 10L 10L 10L 10L 15L 15L 15L 15L 17L 17L 17L 17L 20L 20L 20L 20L 20L 20L 20L 2
  • 如何根据 pandas 中另一行的值组合一行中的值

    我有一个带有几列的 pandas 数据框 单词 开始时间 停止时间 扬声器 我想合并 word 列中的所有值 而 speaker 列中的值不变 此外 我想保留组合中第一个单词的 开始 值和最后一个单词的 停止 值 我目前有 word sta
  • 如何通过比较两个现有变更日志文件来生成变更日志文件

    我正在使用 Liquibase 工具来维护 MySQL 服务器中数据库的版本 在这里 我为数据库生成changeLogFile 一星期后 我想将现有的changeLogFile 与相同的数据库进行比较 在这里 我需要获取上周数据库中进行的更
  • ussd的设计模式建议[重复]

    这个问题在这里已经有答案了 我在用着php创建 USSD 页面 我以前做过这件事 而且这是一项时间有限的黑客工作 基本上是一个巨大的文件 其中包含手机用户可能处于的所有可能状态的 switch 语句 然后将其保存在数据库中并在下一个 USS
  • 使用cowplot将x和y laaxis标签添加到ggplot-grid构建中

    我用cowplot制作了一个网格 library ggplot2 library cowplot ggg1 lt ggplot mtcars aes mpg vs geom point theme axis title x element
  • 使用 Conda 创建像 Anaconda 这样的自定义安装程序

    我正在尝试封装我的 python 环境 以便它可以在不同的机器上使用 为此 我确实使用了 pipelinev 它工作得很好 现在我发现了 Anaconda 我发现这个想法很棒 你可以下载安装程序 pkg 或 win 安装程序 它会手动完成你
  • 驱动程序信息:driver.version:ChromeDriver 未知 使用 Selenium 和 Python 的 Chrome

    当我使用 chrome 驱动程序时 显示驱动程序服务器启动超时 当我尝试使用 Firefox 时 它显示会话意外退出 我正在尝试使用 python 中的 selenium 在服务器上运行远程驱动程序 我应该怎么办 无法创建新会话 未知错误
  • 如何使用 requestAnimationFrame 循环播放多个方块的动画

    我正在使用 HTML 画布绘制多个正方形 我有 2 个函数 1 绘制一个正方形 2 在循环内绘制多个正方形 现在我想使用这些方块来制作动画请求动画帧一次绘制一个正方形 我怎样才能做到这一点 这里有一个jsFiddle var canvas
  • 带有命名占位符的 PDO 准备语句 IN 子句无法按预期工作[重复]

    这个问题在这里已经有答案了 假设一个场景 ids 2 3 但由于某种原因 记录被返回 就像 ids 2 我相信完整代码中的这一行存在一些问题 因为当我回显时 ids 它返回2 3 但实际查询返回时就好像只有一个 id 一样 IE 它仅返回一