我有一个注册页面,基本上我需要将数据插入到4个表中.我是PDO的新手,对某些事感到困惑.
基本上,如果任何插入失败,我不希望任何添加到数据库的东西,这似乎很简单.
我的困惑是,我需要先在我的users表中插入用户的用户名,电子邮件,密码等,这样我就可以得到(不确定如何)使用PDO的MySQL给我的用户(由mysql自动递增).我需要用户uid MySQL为其他表提供了我的用户,因为其他表需要uid所以所有内容都正确链接在一起.我的表是InnoDB,我有外键从users_profiles(user_uid),users_status(user_uid),users_roles(user_uid)到users.user_uid,所以它们都链接在一起.
但同时我想确保如果例如在users表中插入数据之后(因此我可以获得MySQL给用户的uid),如果任何其他插入失败,它将删除插入users表中的数据.
我认为我展示我的代码是最好的; 我已经注释掉了代码,并在代码中进行了解释,这可能使它更容易理解.
// Begin our transaction, we need to insert data into 4 tables:
// users, users_status, users_roles, users_profiles
// connect to database
$dbh = sql_con();
// begin transaction
$dbh->beginTransaction();
try {
// this query inserts data into the `users` table
$stmt = $dbh->prepare('
INSERT INTO `users`
(users_status, user_login, user_pass, user_email, user_registered)
VALUES
(?, ?, ?, ?, NOW())');
$stmt->bindParam(1, $userstatus, PDO::PARAM_STR);
$stmt->bindParam(2, $username, PDO::PARAM_STR);
$stmt->bindParam(3, $HashedPassword, PDO::PARAM_STR);
$stmt->bindParam(4, $email, …Run Code Online (Sandbox Code Playgroud) 我有一个"事件"表.为简单起见,您可以想象它应该像分层类别.它使用嵌套集模型(感谢Mark Hillyer在http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/上的帖子)
我的代码:
$query =
"LOCK TABLE event WRITE;
SELECT @ParentRight := parent.rgt, @Level := parent.level FROM event AS parent WHERE parent.id = '{$data['parent_id']}';
UPDATE event SET rgt = rgt + 2 WHERE rgt > @ParentRight;
UPDATE event SET lft = lft + 2 WHERE lft > @ParentRight;
INSERT INTO event(lft, rgt, level) VALUES(@ParentRight, @ParentRight + 1, @Level);
UNLOCK TABLES;";
mysqli_multi_query($this->db->conn_id, $query);
$data['id'] = $this->db->insert_id();
return $this->db->update('event', $data);
Run Code Online (Sandbox Code Playgroud)
之后我将用更新最后插入的对象 $this->db->update('event', $data)
$data 是用户填充的数组.
问题1: …
我通过mysqli :: multi_query运行多个删除,它正在弄乱下一行查询.抛出以下错误.
Error - SQLSTATE HY000.
Sql error: Commands out of sync; you can't run this command now
Run Code Online (Sandbox Code Playgroud)
我是否需要以某种方式清除多重查询,以便它不会弄乱我的下一个查询?这个错误的原因是什么?
这就是我运行多重查询的方式
function deleteSomeTables($args){
$sql = 'delete 1;delete another;';
if($database->multi_query($sql)){
return true;
}else{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我在Windows 7上使用最新版本的Xampp
这是一个例子。
$mysqli = new mysqli("localhost", "root", "123", "temp");
$mysqli->begin_transaction();
$sql1 = "insert into test (Name) values ('pratik5');";
$sql1 .= "insert into test (Name) values ('pratik6');";
$test = $mysqli->multi_query($sql1);
$mysqli->commit();
Run Code Online (Sandbox Code Playgroud)
两个查询中都没有任何错误,但是在调用时commit()这些值并未存储在数据库中。如果拆分为单独的查询并通过query().
function cpanel_populate_database($dbname)
{
// populate database
$sql = file_get_contents(dirname(__FILE__) . '/PHP-Point-Of-Sale/database/database.sql');
$mysqli->multi_query($sql);
$mysqli->close();
}
Run Code Online (Sandbox Code Playgroud)
sql文件是从phpMyAdmin直接导出的,大约95%的时间运行没有问题,所有表都被创建并插入数据.(我从头开始创建数据库)
另外5%只创建了第一个表,有时创建了前4个表,但没有创建其他表(有30个表).
我决定不使用multi_query,因为它看起来很麻烦,看看是否通过在分号后在每一行使用mysql_query来发生错误.有没有人遇到像这样的问题?
我已经问过一些关于在PHP的多查询中捕获错误的事情了,但没有人回答.现在我已经google了一点,并了解了更多的问题.
我有这个代码:
// Some starting variables
$test = new mysqli("localhost","root","","testdatabase");
$Query = array();
$Query[] = "SELECT 'wos' FROM items WHERE itemID = 3";
$Query[] = "SELECT 'wos' FROM items WHERE itemID";
$Query[] = "SELECT 'wos' FROM items WHERE itemID = 5";
$Query = implode(";",$Query);
$Errors = array();
// Execute multi query
if ($test->multi_query($Query)) {
do {
// fetch results
$Result = $test->store_result();
print_r($Result);
if($test->errno === 0) {
echo $Result->num_rows . "<br>";
}
else {
$Errors[] = $test->error;
}
$Result->close();
if …Run Code Online (Sandbox Code Playgroud) 我有两个具有相同字段的不同选项卡,例如:
host.enabled, service.enabled.
Run Code Online (Sandbox Code Playgroud)
我如何从 1 条更新语句更新他的内容?
我试过:
UPDATE hosts AS h, services AS s SET h.enabled=0, s.enabled=0
WHERE
ctid IN (
SELECT hst.ctid FROM hosts hst LEFT JOIN services srv ON hst.host_id = srv.host_id
WHERE hst.instance_id=1
);
Run Code Online (Sandbox Code Playgroud)
在 mysql 语法上,这个查询的工作方式如下:
UPDATE hosts LEFT JOIN services ON hosts.host_id=services.host_id SET hosts.enabled=0, services.enabled=0 WHERE hosts.instance_id=1
Run Code Online (Sandbox Code Playgroud) session.CreateMultiQuery().Add(...) 接受IQuery,但IQueryOver似乎不从IQuery继承.
对我来说似乎很奇怪,我无法在多个查询中使用QueryOver?
是否可以使用多个查询并且有两个hql查询返回两个不同的实体集,其中一个集合在另一个中使用,并且会话通过第一级缓存"修复"了这个?
例如场景(一个愚蠢的,它可以用连接解决)
public class Room
{
...
public virtual ISet<Bookings> Bookings {get;set;}
public virtual bool IsAvailible {get;set;}
...
}
public class Booking
{
...
}
Run Code Online (Sandbox Code Playgroud)
用两个hql执行一个多标准后:
当从结果及其预订中访问房间时,我希望通过会话的第一级缓存从第二个结果集中解析它们,并避免使用n + 1.
我正在尝试选择我的Django数据库中的所有歌曲,其标签是给定列表中的任何一个.有一个Song模型,一个Tag模型和一个SongTag模型(用于多对多关系).
这是我的尝试:
taglist = ["cool", "great"]
tags = Tag.objects.filter(name__in=taglist).values_list('id', flat=True)
song_tags = SongTag.objects.filter(tag__in=list(tags))
Run Code Online (Sandbox Code Playgroud)
此时我收到一个错误:
DatabaseError: MultiQuery does not support keys_only.
Run Code Online (Sandbox Code Playgroud)
我错了什么?如果您可以建议一个完全不同的方法来解决问题,那么它也会受到欢迎!
编辑:我应该提到我正在使用django-nonrel 在Google AppEngine上使用Django
我想创建一个数据库恢复功能,它将解析用phpMyAdmin进行的转储,并将执行所有查询.
我已经有一个MySQL类来执行查询,但它只知道如何进行单个查询.我正在寻找一种方法将文件内容拆分为单个查询.
我尝试使用preg_split ...但没有设法让它工作.
$queries = preg_split('/[(.+);\s*\n/', $content, -1, PREG_SPLIT_NO_EMPTY);
Run Code Online (Sandbox Code Playgroud)
我对正则表达式不是很了解.有没有办法实现我的目标?
multi-query ×12
php ×6
mysql ×4
mysqli ×4
nhibernate ×2
codeigniter ×1
django ×1
filter ×1
pdo ×1
postgresql ×1
queryover ×1
sql-update ×1
transactions ×1