在执行之前准备多个语句可以吗?
$db = PDO('..connection info...');
$cats_stmt = $db->prepare('SELECT * FROM cats');
$dogs_stmt = $db->prepare('SELECT * FROM dogs');
$cats_stmt->execute();
$cats = $cats_stmt->fetchAll(PDO::FETCH_CLASS);//list of cats
$dogs_stmt->execute();
$dogs = $dogs_stmt->fetchAll(PDO::FETCH_CLASS);//list of dogs
这对于需要依次执行具有不同变量的 2 个语句的循环非常有用。
像这样:
$stmt_addcat = $db->prepare('INSERT INTO cats (name,age) VALUES(?,?)');
$stmt_adddog = $db->prepare('INSERT INTO dogs (name,age) VALUES(?,?)');
foreach($cat_n_dog as $bunch){
$db->beginTransaction();
$dog_name = $bunch['dog']['name'];
$dog_age = $bunch['dog']['age'];
$stmt_adddog->bindParam(1,$dog_name,PDO::PARAM_STR);
$stmt_adddog->bindParam(2,$dog_age,PDO::PARAM_STR);
$result = $stmt_adddog->execute();
if($result===false){
$db->rollBack();
continue;
}
$cat_name = $bunch['cat']['name'];
$cat_age = $bunch['cat']['age'];
$stmt_addcat->bindParam(1,$cat_name,PDO::PARAM_STR);
$stmt_addcat->bindParam(2,$cat_age,PDO::PARAM_STR);
$result = $stmt_addcat->execute();
if($result===false){
$db->rollBack();
continue;
}
$db->commit();
}
我这样问是因为我遇到过 PDO 会出现问题并在 sqlite 驱动程序上抛出错误的情况,所以我想知道上面的示例是否应该工作。
附注例子是当场编造的。
我将作为答案发布,因为评论没有足够的空间。
是的,您可以准备几个准备好的语句,然后在循环中执行它们,这没有任何问题。
交易部分有误。如果您想执行所有查询或不执行查询,则需要在循环之外启动事务(与提交相同)。
这就是 PHP 的地方try/catch
派上用场了。
$db = PDO('..connection info...');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Set error mode to exceptions
try
{
$stmt_addcat = $db->prepare('INSERT INTO cats (name,age) VALUES(?,?)');
$stmt_adddog = $db->prepare('INSERT INTO dogs (name,age) VALUES(?,?)');
$db->beginTransaction();
foreach($cat_n_dog as $bunch) { } // Do your foreach binding and executing here
$db->commit();
}
catch(PDOException $e)
{
$db->rollBack();
echo "Error occurred. Error message: ". $e->getMessage() .". File: ". $e->getFile() .". Line: ". $e->getLine();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)