所以我在 PHP 中有这个数据库类,其中只有 1 个函数(__construct 和 __destruct 除外。让我进一步解释......
我最初是这样写的,所以当我连接到一个数据库时,我会调用我的函数 connect_to_db(),它返回一个 mysqli 对象。然后我使用了这个对象函数(->query()、->prepare()、->bind_param() 等等。 ) 做任何事情。这很困惑(而且仍然是因为我还没有将我的代码切换到我的新类)有很多只做特定事情的函数,例如:
function get_country_info($db, $usrid) {
$statement = "select `name`, `population`, `money`, `food` from `countries` where `usr_id` = ?";
$qry = $db->prepare($statement) or
trigger_error("get_country_info():statement failed...");
$qry->bind_param("i", $usrid);
$qry->execute();
$qry->bind_result($name, $population, $money, $food);
$qry->fetch();
$res = array("name" => $name,
"pop" => $population,
"money" => $money,
"food" => $food);
return $res;
}
我最初计划做的只是为了清楚起见将它们放入一个类中,但我实际上最终做的是创建一个类,该类在创建时为特定数据库创建一个 mysqli 对象(通过参数提供)和销毁时关闭此链接。我非常喜欢不必担心键入 $db->close();,因为当脚本完成执行连接关闭时。
它只有一个功能; 查询()。此函数可以处理提出的任何查询并将其输出为多维数组。它使用 eval()。据我所知,这通常是不受欢迎的——但是 eval() 非常有用;那么为什么它不受欢迎呢?
我想这个功能可能会很慢,但我只是把它用于一个宠物项目(基于浏览器的国家管理游戏),而且我没有注意到任何我根本不担心的事情。我担心的是人们是否通常会在“现实世界”中这样做,或者是否存在人们这样做的某种标准,或者通常使用的 PHP 中包含(或附加)的东西?
我是自学成才的,所以有时我真的不知道做事的最佳方法。也许有人可以在这里给我建议?
有问题的功能可以在这里看到: http://pastebin.org/353721 ,因为它有 ~60 行,我不想让页面困惑。我也没有对它进行广泛的测试(我什至不知道什么是单元测试,所以我通过多种不同的方式使用该功能进行测试)所以它可能有问题我不知道你们可以指出出。
谢谢。
最佳答案
我觉得还不错。您基本上完成了数据库的基本包装,并且执行了数据库独立性的第一步,这很好。
这对于组织良好的小型项目可能很有用,但是一旦您开始变得更复杂,您很快就会注意到您的方法有一个很大的缺点:您的 SQL 查询仍然分散在站点周围。当您要更改数据库中的任何内容的那一天,您将需要遍历所有站点并查找所有 SQL 语句:这很糟糕(我不得不这样做一次...)。
您现在应该将所有 SQL 代码移到一个地方。所以有多种选择。在类似的上下文中,我使 query() 方法受到保护,然后使 Db 类“抽象”并对其进行子类化。每个子类都是一个类,其中包含与一组特定表相关的多个方法,这是您可以找到 SQL 的唯一地方。项目的其余部分只能调用这些方法。
或者,更好的是,您可以使用 ORM(对象关系映射器)将每个表映射到一个对象。
关于 evals 的弊端:我从未使用过它们。但我认为我不会使用“goto”,因为它是邪恶的,然后我找到了完美契合的神奇地方。因此,如果您调查了所有可能性,并且您认为这是最佳解决方案……请使用它。
关于php - PHP 中的数据库类;只有一个功能 - 关于实践的问题以及它是否是一个好主意,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3099270/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>