热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

混合PHP的mysqli数据访问功能?-MixingPHP'smysqlidataaccessfunctions?

Iveseenacoupleofquestionsoverthelastfewdaysthathaveusedmysqlibutwheretheanswersa

I've seen a couple of questions over the last few days that have used mysqli but where the answers appear to have not recognised the difference between $stmt->execute() and $db->query().

我在过去几天看到了几个使用mysqli的问题,但答案似乎没有认识到$ stmt-> execute()和$ db-> query()之间的区别。

As I understand it, there are two differing models for accessing results in mysqli.

据我了解,在mysqli中访问结果有两种不同的模型。

This one uses raw SQL and requires the programmer to escape the input to prevent SQL injection attacks, but allows the programmer to retrieve an associative array (or a plain array) containing column => value mappings:

这个使用原始SQL并要求程序员转义输入以防止SQL注入攻击,但允许程序员检索包含column => value mappings的关联数组(或普通数组):

$result_set = $db->query("SAFE SQL QUERY HERE");
while ($row = $result_set->fetch_assoc()) {
     # do something with $row['fieldname'];
}  

Alternatively, you can do this, which allows nice binding of parameters and results, but cannot (AFAIK) give you any sort of simple array result:

或者,你可以这样做,它允许很好地绑定参数和结果,但不能(AFAIK)给你任何类型的简单数组结果:

$stmt = $db-prepare("SQL QUERY WITH ? PLACEHOLDERS");
$stmt->bind_param("s", $input_variable);
$stmt->execute();
$stmt->bind_results($output_col1, $output_col2);
while ($stmt->fetch()) {
     # do something with $output_col1 and $output_col2
}

My question is - is there any way with mysqli to get the simple array output shown in the first pattern, but whilst still using safely bound input parameters as per the second pattern?

我的问题是 - 有没有办法用mysqli来获得第一个模式中显示的简单数组输出,但是仍然使用安全绑定的输入参数按照第二个模式?

I can't find anyway to do this (other than using PDO instead!).

我无论如何都找不到这个(除了使用PDO!)。

3 个解决方案

#1


There are multiple implementations of a function to do this sort of thing in the comments on this page of the php manual: mysqli_stmt::fetch

在php手册的这个页面的注释中有一个函数的多个实现来做这种事情:mysqli_stmt :: fetch

#2


Alnitak,

AFAIK, you cannot bind an entire array to the fetched results automatically. Unfortunately. However, if you're looking for array behavior out of it (presumably so it's easier to pass the results around), you could try this:

AFAIK,您无法自动将整个数组绑定到获取的结果。不幸。但是,如果您正在寻找其中的数组行为(可能因此更容易传递结果),您可以尝试这样做:

prepare( 'SELECT id, email FROM email_list' );
 {
  $stmt->execute();
  $stmt->bind_result( $arr['id'], $arr['email'] );

  while( $stmt->fetch() )
   DoSomething( $arr );
 }
?>

This will give you the behavior you requested, above. It will not, however, dynamically bind array fields to associative indeces in the array -- that is, you must specify that id be bound to $arr['id'], etc.

这将为您提供上述请求的行为。但是,它不会将数组字段动态绑定到数组中的关联indeces - 也就是说,必须指定将id绑定到$ arr ['id']等。

If dynamic binding to the associative indeces is really required by your scenario, you could always write a simple class that would first parse the query for the selected fields, then setup the assoc array indeces, then perform the query.

如果您的方案确实需要动态绑定到关联indeces,则可以始终编写一个简单的类,该类首先解析所选字段的查询,然后设置assoc数组indeces,然后执行查询。

#3


I would say no. Thought I haven't worked with mysqli or prepared statements a ton, I believe that each step in your second example is discrete and necessary. The only consolation I can give you is that your first example glossed over some SQL escaping that you can safely and truly ignore in your second example.

我会说不。我以为我没有使用mysqli或准备好的声明,我相信你的第二个例子中的每一步都是离散的和必要的。我能给你的唯一安慰就是你的第一个例子掩盖了一些SQL转义,你可以在第二个例子中安全地忽略它。


推荐阅读
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • APP及其接口测试全面解析
    本文深入探讨了移动应用(APP)及其接口测试的关键点,包括安装与卸载、功能一致性、系统兼容性、权限管理等多个方面的测试策略,以及针对接口的功能、边界值、参数组合等专业测试方法。同时,介绍了几款常用的测试工具,帮助开发者提高测试效率和质量。 ... [详细]
  • 本文探讨了在 PHP 的 Zend 框架下,使用 PHPUnit 进行单元测试时遇到的 Zend_Controller_Response_Exception 错误,并提供了解决方案。 ... [详细]
  • This article explores the process of integrating Promises into Ext Ajax calls for a more functional programming approach, along with detailed steps on testing these asynchronous operations. ... [详细]
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • 本文介绍了如何通过安装和配置php_uploadprogress扩展来实现文件上传时的进度条显示功能。通过一个简单的示例,详细解释了从安装扩展到编写具体代码的全过程。 ... [详细]
  • 本文详细介绍了PHP中几个常用的数组回调函数,包括array_filter、array_map、array_walk和array_reduce。通过具体的语法、参数说明及示例,帮助开发者更好地理解和使用这些函数。 ... [详细]
  • Mysqlcheck作为MySQL提供的一个实用工具,主要用于数据库表的维护工作,包括检查、分析、修复及优化等操作。本文将详细介绍如何使用Mysqlcheck工具,并提供一些实践建议。 ... [详细]
  • 本文详细记录了一位求职者在搜狐进行的两次面试经历,包括面试的具体时间、面试流程、技术问题及个人感受。通过本次面试,作者不仅获得了宝贵的经验,还成功拿到了搜狐的录用通知。 ... [详细]
  • 本文档旨在提供C语言的基础知识概述,涵盖常量、变量、数据类型、控制结构及函数定义等内容。特别强调了常量的不同类型及其在程序中的应用,以及如何正确声明和使用函数。 ... [详细]
  • 本文详细介绍了在MyBatis框架中如何通过#和$两种方式来传递SQL查询参数。使用#方式可以提高执行效率,而使用$则有助于在复杂SQL语句中更好地查看日志。此外,文章还探讨了不同场景下的参数传递方法,包括实体对象、基本数据类型以及混合参数的使用。 ... [详细]
  • Web开发实践:创建连连看小游戏
    本文详细介绍了如何在Web环境中开发一款连连看小游戏,适合初学者和技术爱好者参考。通过本文,您将了解游戏的基本结构、连线算法以及实现方法。 ... [详细]
  • 本文探讨了在 APICloud 平台使用 execScript 方法时如何正确传递对象参数,并提供了详细的示例和解释。 ... [详细]
  • Adversarial Personalized Ranking for Recommendation
    目录概主要内容基础对抗扰动对抗训练细节代码HeX.,HeZ.,DuX.andChuaT.Adversarialpersonalizedrankingforrecommendatio ... [详细]
author-avatar
嘎嘎19850820
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有