我正在DELETE使用SQLite 3 C API 执行一个语句,我想知道如何获取受影响的行数.
不幸的是,没有诸如此类的功能sqlite3_affected_rows.
是否有一种有效的方法可以从mysql中的UPDATE或DELETE查询中获取受影响的行ID列表(不是通过PHP的mysql_affected_rows()受影响的行的#,而是受影响的实际行ID)?
在postgresql中,UPDATE/DELETE查询中有一个RETURNING子句,可用于指定返回的受影响行的值.
在mysql中,获取受影响行的"强力"方式似乎是:1.获取READ LOCK.2.使用UPDATE/DELETE查询的WHERE条件SELECT to以获取受影响的行ID.3.更新/删除.4.释放锁定.
上述方式似乎非常低效.是否有更有效的方法来获取mysql中受影响的行ID?
假设您有一个包含数据库中预先填充数据的表单,您允许用户进行更改并保存表单.如果用户单击保存按钮而不进行任何更改,MySQL将不会实际执行写操作,因此affected_rows将返回0.
我了解行为,但除了检查affected_rows的数量之外,确定更新是否失败的最佳做法是什么?
区分实际失败的更新和"成功"但导致0 affected_rows的更新以便我可以向用户提供反馈的最佳做法是什么?
使用Microsoft SQL Server Management Studio 2008.我做了一个简单的事务:
BEGIN TRAN
SELECT ko.ID, os.ID AS ID2
FROM table_a AS ko
JOIN table_b AS os ON os.ID=ko.ID
WHERE (ko.the_date IS NOT NULL AND os.the_date IS NULL);
UPDATE table_b SET the_date=ko.the_date
FROM table_a AS ko
JOIN table_b AS os ON os.ID=ko.ID
WHERE (ko.the_date IS NOT NULL AND os.the_date IS NULL);
SELECT ko.ID, os.ID AS ID2
FROM table_a AS ko
JOIN table_b AS os ON os.ID=ko.ID
WHERE (ko.the_date IS NOT NULL AND os.the_date IS NULL);
ROLLBACK …Run Code Online (Sandbox Code Playgroud) 当我INSERT和SELECT时,我似乎遇到了遇到affected_rows的问题,它只是因某种原因返回-1?我使用的数据库类,我一直用于我的项目,使用MYSQLI准备语句,以避免sql注入.
有谁知道它为什么一直返回-1?根据我的阅读,它应该能够在INSERT和SELECT上返回受影响的行.
数据库类
$class database {
protected $_mysqli;
protected $_debug;
public function __construct($host, $username, $password, $database, $debug) {
$this->_mysqli = new mysqli($host, $username, $password, $database);
$this->_debug = (bool) $debug;
if (mysqli_connect_errno()) {
if ($this->_debug) {
echo mysqli_connect_error();
debug_print_backtrace();
}
return false;
}
return true;
}
public function q($query) {
if ($query = $this->_mysqli->prepare($query)) {
if (func_num_args() > 1) {
$x = func_get_args();
$args = array_merge(array(func_get_arg(1)),
array_slice($x, 2));
$args_ref = array();
foreach($args as $k => &$arg) {
$args_ref[$k] = &$arg;
} …Run Code Online (Sandbox Code Playgroud) 执行SQL语句时,例如INSERT INTO table... ON DUPLICATE KEY UPDATE ...我依靠mysql_affected_rows()来确定是否执行了插入或更新.作为http://dev.mysql.com/doc/refman/5.1/en/mysql-affected-rows.html上的mysql站点,它指出:
对于INSERT ... ON DUPLICATE KEY UPDATE语句,如果将行作为新行插入,则affected-rows值为1,如果更新现有行,则为2.
一切正常,直到我们升级到MySQL 5.1.16,当时许多查询现在有mysql_affected_rows()返回MINUS ONE(-1)
在http://dev.mysql.com/doc/refman/5.1/en/mysql-store-result.html上的MySQL站点上建议的解决方案是在每次执行函数mysql_query()之后调用函数mysql_store_result()在选择查询上.
但是,PHP似乎没有定义这样的功能.
如何使用PHP和MySQL 5.1.16使mysql_affected_rows()正常工作?
MySQL与PHP,试图更新一行:
$dbQuery = 'UPDATE UserTable SET Age=25 WHERE Id=3';
$result = mysqli_query($dbLink, $dbQuery);
if ($result === FALSE) {
// Take care of error
}
else {
$numAffectedRows = mysqli_affected_rows($dbLink);
}
Run Code Online (Sandbox Code Playgroud)
我在两种不同的情况下得到零$ numAffectedRows :
1.当没有用户行时Id = 3
2.当有一个用户行时Id = 3但是Age已经是25
有没有办法可以区分这两种情况?(除了之前读取行并在更新前手动检查值)
这很奇怪,查询执行得很好并将数据插入表中,但我受影响的行显示在负数而不是 1。有谁知道为什么会发生这种情况?
连接.php:
<?php
error_reporting(0);
$db = new mysqli('localhost', 'root', 'pass', 'db');
?>
Run Code Online (Sandbox Code Playgroud)
这是主要代码:
<?php
include 'connect.php';
include 'blowfish.php';
if($_POST['email'] == true)
{
if($db -> connect_errno)
{
echo "Could not connect to the database, please try again later...";
}
else
{
$email = $_POST['email'];
$query = "SELECT id FROM users WHERE email = ?";
$statmnt = $db -> prepare($query);
$statmnt-> bind_param("s",$email);
$statmnt-> execute();
$statmnt-> bind_result($result);
$statmnt-> fetch();
$statmnt-> reset();
if($result)
{
$id = $result;
$result = "";
$randomString = generateRandomString(50); …Run Code Online (Sandbox Code Playgroud) 我只是在做一些测试,我无法弄清楚我是否以正确的方式做这件事.查询将更新行..但affected_rows总是返回0 ..为什么?
<?php
$connection = new mysqli('localhost', 'user', 'pass', 'db');
if (mysqli_connect_errno()) {
printf("Can't connect to MySQL Server. Errorcode: %s\n", mysqli_connect_error());
exit;
}
$email = $connection->real_escape_string($_GET['email']);
$activation = $connection->real_escape_string($_GET['hash']);
//$query = $connection->query("SELECT email, activationCode, active FROM users WHERE email='".$email."' AND hash='".$activation."' AND active='0'");
$select = $connection->query("UPDATE users SET active = '1' WHERE email='".$email."' AND activationCode='".$activation."' AND active='0'");
printf("Affected rows (UPDATE): %d\n", $select->affected_rows);
$connection->close();
?>
Run Code Online (Sandbox Code Playgroud) 在PHP中,如何检测以下查询中发生的(INSERT或UPDATE):
INSERT INTO ... ON DUPLICATE KEY UPDATE ...
Run Code Online (Sandbox Code Playgroud) 我在做什么。
我有一个删除行的过程。
我得到var_SelectedIds的,分离UUID()
然后
SET @var_SQLStr = '';
SET @var_SQLStr = CONCAT(@var_SQLStr ,'Delete ');
SET @var_SQLStr = CONCAT(@var_SQLStr ,'FROM DemoTable');
SET @var_SQLStr = CONCAT(@var_SQLStr ,'WHERE DemoTableId IN (''',Replace(var_SelectedIds,',',''','''),'''); ');
-- SELECT @var_SQLStr;
PREPARE stmt FROM @var_SQLStr;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Run Code Online (Sandbox Code Playgroud)
我已经尝试过的。
// This is throwing SQL Syntax ERROR.
SET @var_SQLStr = '';
SET @var_SQLStr = CONCAT(@var_SQLStr ,'Delete ');
SET @var_SQLStr = CONCAT(@var_SQLStr ,'FROM DemoTable');
SET @var_SQLStr = CONCAT(@var_SQLStr ,'WHERE DemoTableId IN (''',Replace(var_SelectedIds,',',''','''),'''); ');
SET …Run Code Online (Sandbox Code Playgroud) rows-affected ×11
php ×8
mysql ×6
mysqli ×3
c ×1
rowcount ×1
select ×1
sql-delete ×1
sql-server ×1
sql-update ×1
sqlite ×1
t-sql ×1
unique-key ×1