prepare() 和transactions 是否相互排斥?我有很多构建然后执行的查询,所以听起来我想要的是使用事务;但我在prepare.statment上读到使用 bindParam 方法消除 SQL 注入(inject)的页面。有什么方法可以做到这两者吗?
这是我现在拥有的代码示例(可能正确也可能不正确):
$dbhost=FOO;
$dbuser=FOOBAR;
$dbpass=RABOOF;
$options=array(STUFF);
$dbh = new PDO("mysql:host=$dbhost", $dbuser, $dbpass, $options);
// I know this ^ works
$dbh->beginTransaction();
$record_data = $dbh->prepare("UPDATE $db.$tbl SET :column=:value WHERE `key` = :key;");
function record_data($q,$a,$k){
$record_data->bindParam(':column', $q);
$record_data->bindParam(':value', $a);
$record_data->bindParam(':key', $k);
$record_data->execute();
}
// $pairs is an array with ~50 objects/rows
foreach($pairs as $pair){
list($qstn , $ans) = explode('=', $pair);
switch($qstn){
case 1: if(something) record_data($qstn,$ans,$key); break;
case 2: if(something) record_data($qstn,$ans,$key); break;
case 3: if(something) record_data($qstn,$ans,$key); break;
// more
default: record_data($qstn,$ans,$key); break;
}
}
$dbh->commit();
当我尝试完整的代码时,我得到了无法建立连接,因为目标机器主动拒绝了它。通常当我的连接信息错误(或帐户错误)时,我会看到这样的消息没有正确设置/如我所料)。但我单独测试了 PDO 连接,它工作正常。所以我可能做错了什么。
编辑:prepare() 中允许使用变量吗?
编辑 2:我在 $dbh = PDO(…) 周围添加了 try{} 并添加了 echo "connected" 在 try 的末尾(并执行了 catch 位),并且它回显“已连接”,因此它正在连接。但是在“连接”之后它会打印出该错误消息,因此问题是在成功连接后发生的。
编辑 3:我添加了
$dbRS = $dbh->query("SELECT * FROM `database`.`table`;");
$row = empty($dbRS) ? false : $dbRS->fetch(PDO::FETCH_ASSOC);
print_r($row);
它打印了表格的第一行,所以可以肯定它是连接的。
最佳答案
record_data($q,$a,$k):有一个错误。尝试在函数开头添加 global $record_data;。一般评论:PDO 的主要优点是捕获每个 单个SQL 语句的错误(通过PHP 错误行或返回SQL 错误消息)。 参见 pdo.begintransaction , pdo.commit , pdo.rollback和 pdo.error-handling .
例子:
$dbh->beginTransaction();
/* Do SQL */
$sth1 = $dbh->exec("CREATE TABLE xyz (..)");
$sth2 = record_data($qstn1,$ans1,$key1);
$sth2 = record_data($qstn2,$ans2,$key2);
/* Commit the changes */
$dbh->commit();
关于PHP pdo : prepare() vs transactions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8158448/
所以根据thislink一个是快捷方式包装器(所以我猜它们是一样的)。当我运行bundleexecrakedb:test:prepare时,我得到了这个错误:Don'tknowhowtobuildtask'test:prepare'/Users/aj/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/bin/ruby_executable_hooks:15:in`eval'/Users/aj/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/bin/ruby_executable_hoo
我正在观看Rails教程视频,但我无法弄清楚db:test:prepare命令的实际作用。有人可以提供解释吗? 最佳答案 Therakedb:migrateaboverunsanypendingmigrationsonthedevelopmentenvironmentandupdatesdb/schema.rb.Therakedb:test:loadrecreatesthetestdatabasefromthecurrentdb/schema.rb.Onsubsequentattempts,itisagoodideatofirstr
我将gorose用于带有golang的web项目,代码如下vartablecheckrequest="checkrequest"func(mysqldao*MysqlDao)GetAllCheckRulesByRequestId(idint)[]map[string]interface{}{result,_:=mysqldao.connection.Table(tablecheckrequest).Where("requestid","=",id).Get()returnresult}一段时间后我明白了Can'tcreatemorethanmax_prepared_stmt_count
我正在使用http://github.com/Go-SQL-Driver/MySQL我想从数据库中获取一个值votes,例如“0000”,并将其更新为“1000”。在db.Prepare()之前它工作正常。但在此之后,votes的值发生了变化。除了db.Prepare()之外,我没有对它做任何事情。我的代码是funcVote(_type,didint,usernamestring)(isSucceedbool){db:=lib.OpenDb()deferdb.Close()stmt,err:=db.Prepare(`SELECTvotesFROMusersWHEREusername=?
我正在借助gosqlmock编写一些测试代码。以下代码不验证准备好的语句是否具有正确的查询。主要代码是这样的://main.gopackagemainimport"database/sql"functestFunction(db*sql.DB){db.Prepare("SELECT")}funcmain(){}和测试代码://main_test.gopackagemainimport("testing""github.com/stretchr/testify/assert"sqlmock"gopkg.in/DATA-DOG/go-sqlmock.v1")funcTestPrepare(
来自Prepare()的规范我想我可以像这样使用带有Prepare()的sql查询:st,err:=db.Prepare("SELECTnameFROMpetWHEREname=?","Fluffy")但是我得到这个错误:#command-line-arguments.\dbtest2.go:25:toomanyargumentsincalltodb.PrepareThis是我能找到的唯一使用Prepare()的示例,但他不使用带参数的查询。如何使用Prepare()? 最佳答案 进一步查看您链接到的示例脚本,您会发现...st,e
我有一个脚本需要向数据库中插入大量数据(27万行),并且我使用的是准备好的语句(带有for循环)。当我执行(res,err:=stmt.Exec)时,我可以检索插入到数据库中的最后一个ID(id,err=res.LastInsertId()).但是由于我对数据库发出了很多请求,在16k行之后我得到了max_prepared_statements(16,382)错误(然后我尝试将最大值设置为100万而不是16,382,但是问题仍然存在)。我的问题是是否有另一种方法可以在不使用准备语句的情况下插入数据库并检索最后插入的ID?我现在的插入代码是:stmt,err:=db.Prepare(`I
我有一个使用此方法的简单数据库类function__construct($host,$user,$pass,$db){$this->link=pg_connect("host=$hostport=5432dbname=$dbuser=$userpassword=$pass")or$this->error();}publicfunctionrun($sql,$args=null){if(!$args)$this->query=pg_query($sql);else{$v=md5(uniqid(mt_rand(),true));$this->query=pg_prepare($v,$sql
这个问题在这里已经有了答案:HowtodeletefrommultipletablesinMySQL?(7个答案)关闭3年前。我正在从多个表中的dB中删除数据。我正在使用模式将数据用户名发送到delete-member.php以确认(删除),如下所示:$('.delete-button').on('click',function(e){varusername=$(this).attr('data-id');$('.confirm-delete').attr('data-id',username);});$(".confirm-delete").on('click',function(e
我已经做了相当多的研究、故障排除和搜索,试图解决我的问题,但没有成功。所以这是错误...在非对象上调用成员函数prepare()生成此错误的代码在我的用户Auth类中,如下所示...$this->dbManager->db->prepare('INSERTINTOusers(email,password,user_salt,is_admin)VALUES(:email,:password,:user_salt,:is_admin)');dbManager来自$db,我已将其传递到我的类的__construct中,如下所示...publicfunction__construct($db)