php操作mysqli(示例代码)
亲爱的朋友们,下面是关于PHP操作mysqli的示例代码,希望对你们有所帮助。如果你对mysqli的操作不太熟悉,可以参考下面的代码。
我们需要定义一个名为mysqliHelp的类来处理数据库操作。这个类具有一些实用的方法,如连接数据库、选择数据库、获取查询结果等。让我们深入了解下这些方法的使用。
在类的构造函数中,我们可以初始化数据库连接的相关参数。如果需要查询日志的话,可以在此处进行相应的设置。
接下来是连接数据库的方法connect。在这个方法中,我们首先检查是否已经存在数据库连接,如果存在并且连接有效,我们就不强制重新连接。否则,我们会创建一个新的mysqli对象来连接数据库。如果连接失败,我们会输出错误信息并终止程序运行。
当我们成功连接到数据库后,就可以选择我们要操作的数据库了。select_db方法用于选择数据库,如果成功则返回TRUE,失败则返回FALSE。
接下来是获取查询结果的方法。fetch_array方法返回一个与检索到的行相对应的字符串数组,如果没有更多的行在结果集中则返回NULL。我们还有data_seek方法用于将结果集中的数据指针移动到指定的行。
fetch_assoc和fetch_row方法分别用于返回关联数组和索引数组形式的查询结果。关联数组是以字段名为键,字段值为值的数组;而索引数组则是以数字索引表示字段值的数组。
下面是使用示例代码:
```php
require 'mysqliHelp.php'; //引入上面定义的mysqliHelp类
$mysqli = new mysqliHelp(); //创建mysqliHelp对象
$host = 'localhost'; //数据库主机名
$user = 'username'; //数据库用户名
$pass = 'password'; //数据库密码
$db = 'database_name'; //数据库名
$charset = 'utf8'; //字符集
//连接数据库
$mysqli->connect($host, $user, $pass, $db, $charset);
//选择数据库
if ($mysqli->select_db($db)) {
//执行查询
$query = $mysqli->db->query("SELECT FROM table_name");
//获取查询结果
while ($row = $mysqli->fetch_assoc($query)) {
//处理查询结果
// ...
}
} else {
//数据库选择失败处理
// ...
}
?>
```
```php
// 定义一个函数,用于获取查询字段信息
function fetch_fields($query) {
return $query->fetch_fields();
}
// 注释说明:对于SELECT、SHOW、DESCRIBE或EXPLAIN等语句,mysqli_query()会返回一个结果对象。此函数执行数据库查询,并可选择性地记录查询日志。
public function query($sql, $resultmode = MYSQLI_STORE_RESULT) {
if (MYSQL_OPEN_LOGS) {
// 记录查询开始时间
$sqlstarttime = microtime(true);
}
// 执行真正的数据库查询
$query = $this->db->query($sql, $resultmode);
if (MYSQL_OPEN_LOGS) {
// 记录查询结束时间并计算查询时间
$sqlendttime = microtime(true);
$sqlQueryTime = number_format($sqlendttime - $sqlstarttime, 6); // 查询时间精确到小数点后六位
// 如果查询是SELECT语句,则获取EXPLAIN结果并记录日志信息
if ($query && preg_match("/^(select )/i", $sql)) {
$explain = $this->fetch_array($this->db->query('EXPLAIN '.$sql), MYSQLI_ASSOC);
}
// 将查询日志信息保存到全局数组中
$GLOBALS['mysql_debug_query'][] = array('sql' => $sql, 'time' => $sqlQueryTime, 'info' => $this->db->info, 'explain' => $explain);
}
// 检查查询是否成功,如果不成功则抛出错误并停止执行
if (!$query) {
$this->halt('MySQL Query Error', $sql);
}
// 返回查询结果对象或mysqli_stmt对象(取决于调用方式)
```php
/
面向对象接口与面向过程接口的MySQLi类
提供了一系列与MySQL数据库交互的方法
/
function num_fields($query) {
return $query->field_count;
}
function free_result($query) {
//所有方法等价,释放结果集资源
$query->free();
//$query->free_result();
//$query->close();
}
function insert_id() {
if(($id = $this->db->insert_id) >= 0) {
return $id;
} else {
$idArr = $this->fetch_array($this->query("SELECT last_insert_id() as id"));
return intval($idArr[0]);
}
}
function close() {
return $this->db->close(); //关闭数据库连接
}
function halt($message, $sql) {
$dberror = $this->error(); //获取数据库错误信息
$dberrno = $this->errno(); //获取数据库错误代码
$help_link = " //帮助链接地址,根据错误信息进行编码处理并拼接成完整的URL地址。如果发生错误,跳转到帮助页面寻求帮助。如果无法打开链接,请检查网络连接是否正常。此函数将错误信息显示在屏幕上并退出程序执行。错误信息包括错误类型、错误消息、SQL语句、错误代码和帮助链接等。此函数还提供了退出程序的功能。退出程序后,将无法继续执行后续的代码逻辑和程序流程。您可以根据需要调用其他方法或者继续编写您的程序逻辑来处理异常或执行其他任务。退出程序后,将无法撤销此操作。请确保您已经保存了所有重要的数据和状态信息。退出前请仔细检查程序的状态和数据是否正确保存,以避免不必要的数据丢失或错误处理情况的发生。注意退出程序的不可逆性,谨慎操作。退出程序后,系统将结束当前会话并关闭所有相关资源。再次启动程序时,需要重新建立连接和初始化状态信息。请确保您已经了解了程序的运行环境和依赖关系,以便正确地重新启动程序并恢复之前的操作状态和数据信息。如果您需要进一步的帮助或有任何疑问,请随时联系技术支持团队寻求帮助。我们将竭诚为您服务并解决您的问题。我们将尽力提供及时有效的解决方案和支持服务以确保您的程序能够正常运行并满足您的需求。我们将尽力协助您解决任何技术问题并提供必要的支持和指导以确保您的满意度和成功体验。对于您的任何反馈和建议我们将非常感激并将不断努力改进我们的服务和支持水平以提高客户满意度和忠诚度。" echo "
"; echo "Message: $message
"; echo "SQL: $sql
"; echo "Error: $dberror
"; echo "Errno.: $dberrno
"; echo "Click here to seek help."; echo "
我们来看`mysqli->get_client_info()`和`mysqli_get_client_info()`。这两个函数就像获取MySQL客户端版本的“名片”一样,它们返回字符串描述的Mysql客户端版本信息,帮助我们了解正在使用的客户端版本。
接着是`mysqli->get_client_stats()`和`mysqli_get_client_stats()`,它们像是获取每个客户端进程的“健康报告”,返回每个客户端进程的统计信息,这对于监控数据库性能至关重要。
再来看`mysqli->get_cache_stats()`和`mysqli_get_cache_stats()`,它们的功能就像是查询客户端的“内存缓存使用报告”,返回客户端的zval缓存统计信息,这在分析缓存性能和优化应用时非常有用。这些功能都仅限于mysqlnd。
还有`mysqli->get_server_info()`和`mysqli_get_server_info()`,这两个函数神秘而强大,它们能够获取服务器信息,虽然具体文档不详,但在调试和排查问题时非常有帮助。
接下来是`mysqli::init()`和`mysqli_init()`,这两个函数像是MySQL扩展库的“启动程序”,它们初始化mysqli并返回一个资源类型,这个资源将在后续的数据库操作中发挥重要作用。值得注意的是,这个初始化并非在对象上完成,而是返回了一个$mysqli对象。
其他的函数如`mysqli->kill()`请求服务器杀死一个Mysql线程,就像是数据库中的“终止程序”。而`mysqli->more_results()`检查一个多语句查询是否还有其他查询结果集,如同在查看报告的“多页打印”状态。
还有`mysqli->multi_query()`,它允许你在数据库上执行一个多语句查询,像是执行复杂的“批处理任务”。与此`mysqli->next_result()`准备下一个结果集,从一个多语句查询中取出下一个结果。
接下来是`mysqli->options()`和`mysqli_set_opt()`,这两个函数如同设置数据库连接的“参数调整器”,允许你设置各种选项以满足不同的需求。
然后是`mysqli->ping()`,它像是服务器的“在线状态检查器”,它可以检查服务器连接的状态,并在必要时尝试重新连接。
接下来是`mysqli->prepare()`,它用于准备一个SQL语句,像是数据库的“预处理器”,为执行复杂的查询做好准备。
我们有`mysqli->query()`,这是执行数据库查询的“核心命令”,几乎所有的数据操作都离不开它。而`mysqli->real_connect()`则是建立数据库连接的“首要步骤”,打开一个到Mysql服务端的连接。`mysqli->real_escape_string()`和`mysqli->escape_string()`函数则是对字符串进行转义,确保特殊字符在SQL语句中的安全使用,这个操作会考虑连接的当前字符集。
在深入MySQL数据库的世界时,我们遇到了两个核心组件:mysqli和MySQL_STMT。它们是处理数据库操作的重要工具,拥有众多方法和属性,让我们能够执行各种复杂的SQL查询和事务管理。
让我们聚焦mysqli。这是一个强大的工具,允许我们执行一系列SQL操作。通过调用诸如mysqli->real_query()这样的方法,我们可以执行SQL查询。当需要回滚当前事务时,我们可以调用mysqli->rollback()。如果需要选择默认的数据库进行查询,可以使用mysqli->select_db()。我们还可以设置默认的客户端字符集、清除或设置LOAD DATA LOCAL INFILE命令的处理程序,以及使用SSL建立安全连接等。我们还可以获取系统状态、初始化语句、传输查询结果集、返回当前连接的线程ID以及检查是否设置了线程安全。所有这些功能都使mysqli成为处理MySQL数据库的强大工具。
mysqli_stmt 对象
方法:
`get_warnings()` → `mysqli_stmt_get_warnings()`:检索与预处理语句相关的警告信息。
`prepare()`:准备一个SQL语句以供执行,是执行复杂查询的重要步骤。
`reset()`:重置预处理语句,为下一次使用做好准备。
`send_long_data()` 或 `mysqli_stmt_send_long_data()`:用于发送大型数据块。
`store_result()`:从预处理语句中存储结果集,以便后续处理。
`more_results()` 和 `next_result()`:用于处理多结果集的情境,尤其当执行存储过程时非常有用。它们仅适用于使用mysqlnd驱动的MySQL连接。
`num_rows()` 或 `mysqli_stmt_num_rows()`:获取预处理语句的结果集中的行数。可以通过查阅属性 `$mysqli_stmt->num_rows` 获取。
属性(N/A表示没有相关属性):
N/A(没有文档)表示这些方法或属性缺乏详细的文档描述。在实际使用中可能需要参考官方文档或其他资源以获取更多信息。
mysqli_result 对象(面向对象接口与过程化接口的别名)
属性:
`current_field` → `mysqli_field_tell()`:获取当前字段在结果集中的位置。
`field_count` → `mysqli_num_fields()`:计算结果集中的字段数量。
`lengths` → `mysqli_fetch_lengths()`:返回当前行每列值的长度数组。注意,此属性可能不适用于所有情况。
`num_rows` → `mysqli_num_rows()`:获取结果集中的行数。
方法:
`data_seek()` → `mysqli_data_seek()`:移动结果集中的指针到任意行。这是处理大型结果集时的有用工具。
`fetch_all()` → `mysqli_fetch_all()`:获取所有的结果行,并以关联数组、数值索引数组或两者兼有的方式返回结果集。此功能特别适用于使用mysqlnd驱动的情况。需要注意的是,此方法的可用性可能受限于特定的数据库驱动和版本。使用时请确保参考的官方文档和资源。
这些方法和属性为开发者提供了丰富的工具集,用于高效、灵活地与MySQL数据库进行交互。通过深入了解每个方法和属性的作用和使用场景,开发者可以更加高效地编写代码,实现复杂的数据库操作。MySQL结果集处理:深入理解mysqli_result及其相关函数
在MySQL的PHP扩展中,mysqli_result类为我们提供了处理查询结果集的一系列方法。这些函数允许我们以不同的方式获取数据,并对结果集进行操作。让我们深入了解这些函数及其背后的机制。
1. mysqli_result的相关函数:
`fetch_array()`: 以关联数组、数值索引数组或两者兼有的方式抓取一行结果。
`fetch_assoc()`: 以关联数组方式抓取一行结果。
`fetch_field_direct()`: 抓取一个单字段的元数据。
`fetch_field()`: 返回结果集中的下一个字段。
`fetch_fields()`: 返回一个代表结果集字段的对象数组。
`fetch_object()`: 以一个对象的方式返回一个结果集中的当前行。
`fetch_row()`: 以一个枚举数组方式返回一行结果。
`field_seek()`: 设置结果指针到特定的字段开始位置。
`free_result()`: 释放与一个结果集相关的内存。
2. MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别:
这两个参数在查询结果集的处理上有着重要的区别。
MYSQLI_STORE_RESULT:
+ 立即检索所有的行。
+ 在从服务器上检索结果集时,就提取了行,并为之分配内存,存储到客户机中。调用`mysqli_fetch_array()`不会返回错误,除非结果集尚未结束但已无更多行可获取。
MYSQLI_USE_RESULT:
+ 启动查询,但实际上并未获取任何行。
+ 把较大的负载加到了服务器上,因为它必须保留结果集中的行,直到客户机看起来适合检索所有的行。
+ 与MYSQLI_STORE_RESULT相比,其内存需求较低,因为只需为每次处理的单行分配足够的空间。这使得速度较快,因为不必为结果集建立复杂的数据结构。但这也意味着如果在与服务器通信时发生错误,`mysqli_fetch_array()`可能在没有到达结果集末端的情况下就返回NULL。
值得注意的是,当使用MYSQLI_USE_RESULT时,尝试使用`mysqli_result::data_seek()`会出错,因为这个函数不能与MYSQLI_USE_RESULT一起使用。
选择MYSQLI_STORE_RESULT还是MYSQLI_USE_RESULT取决于你的需求。如果你需要一次检索多个行并希望在客户端处理它们,可以选择MYSQLI_STORE_RESULT。如果你对内存使用较为关心并且希望减轻服务器的负载,可以选择MYSQLI_USE_RESULT。
数据库助手初始化
$dbHelper = new mysqliHelper();
建立与数据库的连接
$dbHelper->connect('localhost', 'root', '', 'tt');
选择数据库并设置字符集
$dbHelper->db->select_db("tt");
$dbHelper->db->set_charset("utf8");
执行查询操作,获取产品数据
$query = $dbHelper->query("select id, cateid, title from product limit 22", MYSQLI_STORE_RESULT);
// 注意:如果使用MYSQLI_USE_RESULT,可能会在执行特定操作时出错,因此这里选择MYSQLI_STORE_RESULT模式。
获取查询结果的相关信息
通过$query对象,我们可以获取查询结果的总数、受影响的行数、列数等信息。例如:
echo $query->num_rows."总数"; // 输出查询结果的总数。
var_dump($dbHelper->affected_rows()); // 输出受影响的行数。
var_dump($dbHelper->num_fields($query)); // 输出查询结果的列数。
使用循环遍历查询结果 我们可以使用循环来遍历查询结果,并输出每行的数据。例如:
$row = $dbHelper->fetch_row($query);
var_dump($row); // 输出当前行的数据。 接下来,我们可以使用条件查询来获取特定条件下的产品数据。例如: 我们可以使用预处理语句来执行带有参数的SQL查询,提高安全性和效率。例如: 第1种方式:
$sql = "select id, cateid, title from product where cateid=? and title like ? and createtime<" . time();
$stmt = $dbHelper->prepare($sql);
假设你正在使用 `$sql` 语句来从 `product` 表中选取特定 `cateid` 的产品数据。当执行 `multi_query()` 后,你需要在循环中处理每个查询的结果。当查询返回结果集时,你可能需要对结果进行存储和处理。如果操作成功,你可能会进一步处理事务以确保数据的完整性和一致性。
你的代码中有一些关于结果集的处理逻辑和事务处理的逻辑。让我们更详细地看一下:
当调用 `multi_query()` 执行多条SQL语句后,你需要遍历每个结果集。在此过程中,你可能会遇到两种类型的查询结果:一种是有结果集的查询,另一种是事务相关的查询。对于每种结果集,你都需要进行相应的处理。对于事务相关的查询,你需要确保每一步操作都成功执行,否则需要回滚事务以保持数据的完整性。
在处理结果集时,你使用了 `use_result()` 方法来获取 `mysqli_result` 对象并处理查询结果。你也检查了是否有更多的结果集并进行了适当的分隔。你还处理了事务相关的更新操作,确保每一步操作都成功执行并且影响了预期的行数。如果任何一步失败,你会回滚事务并输出失败信息。否则,你会提交事务并输出成功信息。
在整个过程中,你需要注意一些关键点:确保操作的表是InnoDB类型的表(支持事务处理),避免在MyISAM表上执行可能导致逻辑错误的操作;你需要处理异常和错误以确保程序的健壮性。你还可以考虑使用更现代的数据库操作方法(如预处理语句)以提高安全性和性能。虽然这段代码可能在某些情况下有效,但它可能需要进一步优化和改进以满足更广泛的需求和最佳实践的要求。总体而言,这段代码的意图在于通过多查询操作和事务处理来管理数据库操作并确保数据的完整性。
编程语言
- php操作mysqli(示例代码)
- Vue源码探究之状态初始化
- JavaScript运动框架 多物体任意值运动(三)
- 百度编辑器二次开发常用手记整理小结
- 超全面的javascript中变量命名规则
- 爬取今日头条Ajax请求
- 小程序input框失焦事件在提交事件前的处理
- php 5.6版本中编写一个PHP扩展的简单示例
- 全方位网站优化方案助您提升流量与转化率
- 青岛SEO推广公司电话助力企业网络营销新起点
- 如何优化列表页SEO
- 进贤运营SEO投资多少钱才能实现高效排名?
- 双鸭山SEO优化服务价格如何选择性价比高的方案
- 秦皇岛专业SEO外包提升网站排名实现业务增长
- 如何准确翻译作业一词作业怎么翻译成英语
- 阳曲SEO优化参考价全方位解析性价比之选