尝试使用mysqli在php7.3中启动事务时出现致命错误
我要执行以下事务:尝试使用mysqli在php7.3中启动事务时出现致命错误,php,sql,mysqli,transactions,Php,Sql,Mysqli,Transactions,我要执行以下事务: START TRANSACTION; INSERT INTO `orders` (producten, totaalprijs, account_id) VALUES ( "{\"601bced33b191\":{\"naam\":\"Sierkussens binnen\", \"alias\":\"sierkussens - binnen\&quo
START TRANSACTION;
INSERT INTO
`orders` (producten, totaalprijs, account_id)
VALUES
(
"{\"601bced33b191\":{\"naam\":\"Sierkussens binnen\", \"alias\":\"sierkussens - binnen\", \"url\":\"https:\\ / \\ / printzelf.nl\\ / new\\ / product\\ / sierkussens - binnen ? term = sierkussen\", \"afbeelding\":\"cms\\ / images\\ / producten\\ / textiel_producten\\ / Sierkussens\\ / sierkussen_1.jpg\", \"aantal\":\"1\", \"hoogte\":null, \"breedte\":null, \"uploaden\":\"1\", \"specificaties\":{\"Formaat\":{\"waarde\":\"40 x 40 cm\"}, \"Materiaal\":{\"waarde\":\"Dekostof\"}, \"Samenstelling\":{\"waarde\":\"Hoes\"}, \"Kleur garen\":{\"waarde\":\"Zwart\"}, \"Kleur rits\":{\"waarde\":\"Zwart\"}, \"Ontwerp\":{\"waarde\":\"PRO ontwerpcontrole\"}}, \"prijs\":\"13.99\", \"totaalprijs\":13.99, \"canvas\":\"{\\n \\\"customer_id\\\": \\\"33\\\", \\n \\\"order_id\\\": \\\"123\\\", \\n \\\"quantity\\\": \\\"1\\\", \\n \\\"rulers\\\": null, \\n \\\"canvas_size\\\": \\\"0x0\\\", \\n \\\"bleed\\\": null, \\n \\\"safety_margin\\\": null, \\n \\\"dpi\\\": null, \\n \\\"multiple_layouts\\\": null, \\n \\\"procheck\\\": \\\"y\\\", \\n \\\"multiple_pages\\\": \\\"1\\\", \\n \\\"product_name\\\": \\\"Sierkussens binnen\\\", \\n \\\"thumbnail\\\": \\\"cms\\\\\\ / images\\\\\\ / producten\\\\\\ / textiel_producten\\\\\\ / Sierkussens\\\\\\ / sierkussen_1.jpg\\\"\\n}\"}}", "19", "33"
)
;
UPDATE
`orders`
SET
order_id = CONCAT(account_id, ".", id)
WHERE
id = LAST_INSERT_ID();
COMMIT;
所以我试着开始这样的交易:
$conn->autocommit(FALSE);
$conn->query('
INSERT INTO orders
(
producten,
totaalprijs,
account_id
)
VALUES
(
"'.$conn->real_escape_string($encodedproductenarray).'",
"'.$conn->real_escape_string(subtractbtw($subtotaalcheckoutafr)).'",
"'.$conn->real_escape_string($_SESSION['user']['id']).'"
)');
$conn->query('
UPDATE orders SET order_id = CONCAT(account_id, ".", id)
WHERE id = LAST_INSERT_ID()');
$conn->commit();
$insertorder = '
START TRANSACTION;
INSERT INTO orders
(
producten,
totaalprijs,
account_id
)
VALUES
(
"'.$conn->real_escape_string($encodedproductenarray).'",
"'.$conn->real_escape_string(subtractbtw($subtotaalcheckoutafr)).'",
"'.$conn->real_escape_string($_SESSION['user']['id']).'"
);
UPDATE orders SET order_id = CONCAT(account_id, ".", id)
WHERE id = LAST_INSERT_ID();
COMMIT;';
$insertordercon = $conn->query($insertorder);
但这给了我以下错误:
PHP Fatal error: Uncaught Error: Call to undefined method Connection::autocommit()
我做错什么了吗
$conn是我的连接类,包含以下内容:
session_start();
class Connection {
// Configure Database Vars
private $host = 'localhost';
private $username = 'sdgsdg';
private $password = 'sdgsdg!';
private $db_name = 'dsgsd';
public $db;
function __construct() {
// Create connection
$db = new mysqli($this->host, $this->username, $this->password, $this->db_name);
// Check connection
if ($db->connect_errno > 0) {
die('Unable to connect to the database: '.$db->connect_error);
}
$this->db = $db;
}
public function query($query) {
$db = $this->db;
$this->db->query('SET NAMES utf8');
if (!$result = $this->db->query($query)) {
die('There was an error running the query ['.$db->error.']');
} else {
return $result;
}
}
public function multi_query($query) {
$db = $this->db;
if (!$result = $this->db->multi_query($query)) {
die('There was an error running the multi query ['.$db->error.']');
} else {
return $result;
}
}
public function real_escape_string($value) {
return $this->db->real_escape_string($value);
}
public function inserted_id() {
return $this->db->insert_id;
}
}
$conn = new Connection();
我还尝试将整个事务添加到查询中,如下所示:
$conn->autocommit(FALSE);
$conn->query('
INSERT INTO orders
(
producten,
totaalprijs,
account_id
)
VALUES
(
"'.$conn->real_escape_string($encodedproductenarray).'",
"'.$conn->real_escape_string(subtractbtw($subtotaalcheckoutafr)).'",
"'.$conn->real_escape_string($_SESSION['user']['id']).'"
)');
$conn->query('
UPDATE orders SET order_id = CONCAT(account_id, ".", id)
WHERE id = LAST_INSERT_ID()');
$conn->commit();
$insertorder = '
START TRANSACTION;
INSERT INTO orders
(
producten,
totaalprijs,
account_id
)
VALUES
(
"'.$conn->real_escape_string($encodedproductenarray).'",
"'.$conn->real_escape_string(subtractbtw($subtotaalcheckoutafr)).'",
"'.$conn->real_escape_string($_SESSION['user']['id']).'"
);
UPDATE orders SET order_id = CONCAT(account_id, ".", id)
WHERE id = LAST_INSERT_ID();
COMMIT;';
$insertordercon = $conn->query($insertorder);
但是这给了我一个语法错误。您的类中有一个
mysqli
对象。这包含了您希望使用的所有方法。这样做:
$conn->autocommit(FALSE);
$conn->query('
INSERT INTO orders
(
producten,
totaalprijs,
account_id
)
VALUES
(
"'.$conn->real_escape_string($encodedproductenarray).'",
"'.$conn->real_escape_string(subtractbtw($subtotaalcheckoutafr)).'",
"'.$conn->real_escape_string($_SESSION['user']['id']).'"
)');
$conn->query('
UPDATE orders SET order_id = CONCAT(account_id, ".", id)
WHERE id = LAST_INSERT_ID()');
$conn->commit();
$insertorder = '
START TRANSACTION;
INSERT INTO orders
(
producten,
totaalprijs,
account_id
)
VALUES
(
"'.$conn->real_escape_string($encodedproductenarray).'",
"'.$conn->real_escape_string(subtractbtw($subtotaalcheckoutafr)).'",
"'.$conn->real_escape_string($_SESSION['user']['id']).'"
);
UPDATE orders SET order_id = CONCAT(account_id, ".", id)
WHERE id = LAST_INSERT_ID();
COMMIT;';
$insertordercon = $conn->query($insertorder);
$conn->db->autocommit(FALSE);
$conn->query($conn)
插入订单
(
producten,
totaalprijs,
帐号
)
价值观
(
“..conn->real_escape_string($encodedproductenarray)。”,
“'.$conn->real_escape_string(subtractbtw($subtotalcheckoutafr))。”,
“'.$conn->real_escape_string($_SESSION['user']['id'])”
)');
$conn->query($conn)
更新订单集订单id=CONCAT(账户id,“.”,id)
其中id=LAST_INSERT_id()');
$conn->db->commit();
或者,您可以在类中实现这些方法。您已经为query
和real\u escape\u string
这样做了,所以应该很简单。只需在类中插入:
公共功能自动提交($b){
$this->db->autocommit($b);
}
公共功能提交(){
$this->db->commit();
}
…或类似对象。您的类中有一个
mysqli
对象。这包含了您希望使用的所有方法。这样做:
$conn->autocommit(FALSE);
$conn->query('
INSERT INTO orders
(
producten,
totaalprijs,
account_id
)
VALUES
(
"'.$conn->real_escape_string($encodedproductenarray).'",
"'.$conn->real_escape_string(subtractbtw($subtotaalcheckoutafr)).'",
"'.$conn->real_escape_string($_SESSION['user']['id']).'"
)');
$conn->query('
UPDATE orders SET order_id = CONCAT(account_id, ".", id)
WHERE id = LAST_INSERT_ID()');
$conn->commit();
$insertorder = '
START TRANSACTION;
INSERT INTO orders
(
producten,
totaalprijs,
account_id
)
VALUES
(
"'.$conn->real_escape_string($encodedproductenarray).'",
"'.$conn->real_escape_string(subtractbtw($subtotaalcheckoutafr)).'",
"'.$conn->real_escape_string($_SESSION['user']['id']).'"
);
UPDATE orders SET order_id = CONCAT(account_id, ".", id)
WHERE id = LAST_INSERT_ID();
COMMIT;';
$insertordercon = $conn->query($insertorder);
$conn->db->autocommit(FALSE);
$conn->query($conn)
插入订单
(
producten,
totaalprijs,
帐号
)
价值观
(
“..conn->real_escape_string($encodedproductenarray)。”,
“'.$conn->real_escape_string(subtractbtw($subtotalcheckoutafr))。”,
“'.$conn->real_escape_string($_SESSION['user']['id'])”
)');
$conn->query($conn)
更新订单集订单id=CONCAT(账户id,“.”,id)
其中id=LAST_INSERT_id()');
$conn->db->commit();
或者,您可以在类中实现这些方法。您已经为query
和real\u escape\u string
这样做了,所以应该很简单。只需在类中插入:
公共功能自动提交($b){
$this->db->autocommit($b);
}
公共功能提交(){
$this->db->commit();
}
…或类似的方法。如果您使用的是自定义连接类,当然不能只调用
mysqli
的方法。您需要实现一个方法,告诉它在$this->db
$conn->db->autocommit()上调用autocommit
代码>记住函数在mysqli对象上,而不是在包装器类上。或者,您需要在类中创建一个调用mysqli方法的等效函数(尽管,这实际上是毫无意义的)您还应该了解如何使用with占位符,而不是手动转义值并将其直接放入查询中。您还尝试使用query()
-方法而不是multi\u query()执行包含多个查询的字符串
-method.@ADyson谢谢,我让它这样工作。如果您使用的是自定义连接类,当然不能只调用mysqli
的方法。您需要实现一个方法,告诉它在$this->db
$conn->db->autocommit()上调用autocommit
代码>记住函数在mysqli对象上,而不是在包装器类上。或者,您需要在类中创建一个调用mysqli方法的等效函数(尽管,这实际上是毫无意义的)您还应该了解如何使用with PLACEHOLDER,而不是手动转义值并将其直接放入查询中。您还尝试使用query()
-方法而不是multi\u query()
-方法来执行包含多个查询的字符串。@ADyson谢谢您,我这样做了。