一、 DBQuery对象
现在,我们的DBQuery对象简单地模仿一个存储过程—一旦被执行,即返回一个必须进行保存的结果资源;并且如果你想使用该结果集上的函数(例如num_rows()或fetch_row())的话,你必须传递MySqlDB对象。那么,如果由DBQuery对象来实现MySqlDB对象(其设计目的是对一个执行查询的结果进行操作)实现的函数,效果如何呢?让我们继续使用上一篇示例中的代码;并且让我们假定,现在由DBQuery对象管理我们的结果资源。DBQuery类的源码如列表1所示。
列表1.使用DBQuery类。
<ol class="dp-c"> <li class="alt"><span><span class="keyword">require</span><span> </span><span class="string">'mysql_db.php'</span><span>; </span></span></li> <li> <span class="keyword">require_once</span><span> </span><span class="string">'query.php'</span><span>; </span> </li> <li class="alt"> <span class="vars">$db</span><span> = </span><span class="keyword">new</span><span> MySqlDb; </span> </li> <li> <span class="vars">$db</span><span>->connect(</span><span class="string">'host'</span><span>, </span><span class="string">'username'</span><span>, </span><span class="string">'pass'</span><span>); </span> </li> <li class="alt"> <span class="vars">$db</span><span>->query(</span><span class="string">'use content_management_system'</span><span>); </span> </li> <li> <span class="vars">$query</span><span> = </span><span class="keyword">new</span><span> DBQuery(</span><span class="vars">$db</span><span>); </span> </li> <li class="alt"> <span class="vars">$query</span><span>->prepare(</span><span class="string">'SELECT fname,sname FROM users WHERE username=:1S AND pword=:2S AND expire_time<:3i><span>); </span><li><span>try { </span></li> <li class="alt"> <span> </span><span class="keyword">if</span><span>(</span><span class="vars">$query</span><span>->execute(</span><span class="string">"visualad"</span><span>, </span><span class="string">"apron"</span><span>, time()))->num_rows() == 1) { </span> </li> <li> <span></span><span class="func">echo</span><span>(</span><span class="string">'Correct Credentials'</span><span>); </span> </li> <li class="alt"> <span> } </span><span class="keyword">else</span><span> { </span> </li> <li> <span></span><span class="func">echo</span><span>(</span><span class="string">'Incorrect Credentials / Session Expired'</span><span>); </span> </li> <li class="alt"><span> } </span></li> <li> <span>} catch (QueryException </span><span class="vars">$e</span><span>) { </span> </li> <li class="alt"> <span> </span><span class="func">echo</span><span>(</span><span class="string">'Error executing query: '</span><span> . </span><span class="vars">$e</span><span>); </span> </li> <li><span>} </span></li></:3i></span> </li> </ol>
上面修改后的代码中我们最感兴趣的是,catch语句和execute语句。
◆execute语句不再返回一个结果资源,现在它返回DBQuery对象本身。
◆DBQuery对象现在实现num_rows()函数—我们从DB接口中已经熟悉。
◆如果查询执行失败,它抛出一个QueryException类型的异常。当被转换成一个字符串时,它将返回发生的错误的细节信息。
为此,你需要使用PHP代理。事实上,你在我们的DBQuery对象中已经使用代理了,但是现在将更为深入地使用它来把它与MySqlDB对象紧密绑定。该DBQuery对象已经被使用一个实现DB接口的对象初始化,并且它已经包含一个成员函数execute—由它调用DB对象的query()方法来执行该查询。这个DBQuery对象本身并不实际地查询数据库,它把这项任务交由DB对象来完成。这就是代理,其实是一个进程—借助于这个进程,通过把消息发送给另一个实现相同的或类似行为的对象,一个对象可以实现一个特别的行为。
为此,你需要修改DBQuery对象以便包括所有的函数—它们操作一个来自DB对象的结果资源。当执行查询以调用DB对象的相应函数并且返回它的结果时,你需要使用存储的结果。下列函数将被添加:
列表2:使用代理扩展DBQuery类。
<ol class="dp-c"> <li class="alt"><span><span class="keyword">class</span><span> DBQuery </span></span></li> <li><span>{ </span></li> <li class="alt"><span> ..... </span></li> <li><span> </span></li> <li class="alt"> <span> </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> fetch_array() </span> </li> <li><span> { </span></li> <li class="alt"> <span></span><span class="keyword">if</span><span> (! </span><span class="func">is_resource</span><span>(</span><span class="vars">$this</span><span>->result)) { </span> </li> <li> <span> </span><span class="keyword">throw</span><span> </span><span class="keyword">new</span><span> Exception(</span><span class="string">'Query not executed.'</span><span>); </span> </li> <li class="alt"><span>} </span></li> <li><span> </span></li> <li class="alt"> <span></span><span class="keyword">return</span><span> </span><span class="vars">$this</span><span>->db->fetch_array(</span><span class="vars">$this</span><span>->result); </span> </li> <li><span> } </span></li> <li class="alt"><span> </span></li> <li> <span> </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> fetch_row() </span> </li> <li class="alt"><span> { </span></li> <li> <span></span><span class="keyword">if</span><span> (! </span><span class="func">is_resource</span><span>(</span><span class="vars">$this</span><span>->result)) { </span> </li> <li class="alt"> <span> </span><span class="keyword">throw</span><span> </span><span class="keyword">new</span><span> Exception(</span><span class="string">'Query not executed.'</span><span>); </span> </li> <li><span>} </span></li> <li class="alt"><span> </span></li> <li> <span></span><span class="keyword">return</span><span> </span><span class="vars">$this</span><span>->db->fetch_row(</span><span class="vars">$this</span><span>->result); </span> </li> <li class="alt"><span> } </span></li> <li><span> </span></li> <li class="alt"> <span> </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> fetch_assoc() </span> </li> <li><span> { </span></li> <li class="alt"> <span></span><span class="keyword">if</span><span> (! </span><span class="func">is_resource</span><span>(</span><span class="vars">$this</span><span>->result)) { </span> </li> <li> <span> </span><span class="keyword">throw</span><span> </span><span class="keyword">new</span><span> Exception(</span><span class="string">'Query not executed.'</span><span>); </span> </li> <li class="alt"><span>} </span></li> <li><span> </span></li> <li class="alt"> <span></span><span class="keyword">return</span><span> </span><span class="vars">$this</span><span>->db->fetch_assoc(</span><span class="vars">$this</span><span>->result); </span> </li> <li><span> } </span></li> <li class="alt"><span> </span></li> <li> <span> </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> fetch_object() </span> </li> <li class="alt"><span> { </span></li> <li> <span></span><span class="keyword">if</span><span> (! </span><span class="func">is_resource</span><span>(</span><span class="vars">$this</span><span>->result)) { </span> </li> <li class="alt"> <span> </span><span class="keyword">throw</span><span> </span><span class="keyword">new</span><span> Exception(</span><span class="string">'Query not executed.'</span><span>); </span> </li> <li><span>} </span></li> <li class="alt"><span> </span></li> <li> <span></span><span class="keyword">return</span><span> </span><span class="vars">$this</span><span>->db->fetch_object(</span><span class="vars">$this</span><span>->result); </span> </li> <li class="alt"><span> } </span></li> <li><span> </span></li> <li class="alt"> <span> </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> num_rows() </span> </li> <li><span> { </span></li> <li class="alt"> <span></span><span class="keyword">if</span><span> (! </span><span class="func">is_resource</span><span>(</span><span class="vars">$this</span><span>->result)) { </span> </li> <li> <span> </span><span class="keyword">throw</span><span> </span><span class="keyword">new</span><span> Exception(</span><span class="string">'Query not executed.'</span><span>); </span> </li> <li class="alt"><span>} </span></li> <li><span> </span></li> <li class="alt"> <span></span><span class="keyword">return</span><span> </span><span class="vars">$this</span><span>->db->num_rows(</span><span class="vars">$this</span><span>->result); </span> </li> <li><span> } </span></li> <li class="alt"><span>} </span></li> </ol>
每个函数的实现相当简单。它首先进行检查,以确保已经执行查询,然后把任务代理到DB对象,返回它的结果就好象它是查询对象本身(称作是基本数据库函数)一样。 1

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP可以轻松创建互动网页内容。1)通过嵌入HTML动态生成内容,根据用户输入或数据库数据实时展示。2)处理表单提交并生成动态输出,确保使用htmlspecialchars防XSS。3)结合MySQL创建用户注册系统,使用password_hash和预处理语句增强安全性。掌握这些技巧将提升Web开发效率。

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

PHP在现代Web开发中仍然重要,尤其在内容管理和电子商务平台。1)PHP拥有丰富的生态系统和强大框架支持,如Laravel和Symfony。2)性能优化可通过OPcache和Nginx实现。3)PHP8.0引入JIT编译器,提升性能。4)云原生应用通过Docker和Kubernetes部署,提高灵活性和可扩展性。

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP和Python各有优势,适合不同场景。1.PHP适用于web开发,提供内置web服务器和丰富函数库。2.Python适合数据科学和机器学习,语法简洁且有强大标准库。选择时应根据项目需求决定。

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中