MySQL查询不更新行

7
我这里有一个奇怪的问题。我已经试图找出问题所在好几个小时了。我有一个函数应该会更新我的数据库中的表,并将“date_vente”(英文为 date_sold)设置为 NOW()。查询非常简单,但它一直报告匹配到 1 行,但未更改任何数据。问题是,数据应该被更改。如果我手动运行查询,它就可以正常工作,但如果我从 PHP 应用程序运行它,则失败...
//Marque le panier comme vendu
$sqlstring = "UPDATE ".$prefix_tables_panier."paniers SET date_vente = NOW() WHERE no_panier = ".$data_panier["no_panier"];
$result = mysql_query($sqlstring, $conn_panier);
echo $sqlstring.'<br>';
echo mysql_affected_rows($conn_panier); echo '<br>';
echo mysql_error($conn_panier); echo '<br>';
echo mysql_errno($conn_panier); echo '<br>';
var_dump($conn_panier); echo '<br>';
var_dump(mysql_error($conn_panier)); echo '<br>';
var_dump(mysql_info($conn_panier)); echo '<br>';
var_dump(mysql_stat($conn_panier)); echo '<br>';

输出结果如下:

UPDATE panier_paniers SET date_vente = NOW() WHERE no_panier = 840
0

0
resource(5) of type (mysql link)
string(0) ""
string(40) "Rows matched: 1 Changed: 0 Warnings: 0"
string(145) "Uptime: 1640423 Threads: 5 Questions: 39673341 Slow queries: 0 Opens: 1132 Flush tables: 1 Open tables: 235 Queries per second avg: 24.185" 7

问题在于应将一个名为“baskets”的表写入一个NOW值,但它没有这样做。不是因为连接错误,函数刚刚使用了相同的连接ID(已var_dumped),它们都具有相同的ID,连接仍然是打开状态,我正在尝试更新的列中有一个“0000-00-00 00:00:00”的值... 是否可以给我一些更多的提示?谢谢。
UPDATE panier_paniers SET date_vente = NOW() WHERE no_panier = 840
0

0
resource(5) of type (mysql link)
string(0) ""
string(40) "Rows matched: 1 Changed: 0 Warnings: 0"
string(145) "Uptime: 1641927 Threads: 5 Questions: 39681590 Slow queries: 0 Opens: 1132 Flush tables: 1 Open tables: 235 Queries per second avg: 24.168"

UPDATE panier_paniers SET date_vente = "2011-12-28 12:00:17" WHERE no_panier = 840
1

0
resource(5) of type (mysql link)
string(0) ""
string(40) "Rows matched: 1 Changed: 1 Warnings: 0"
string(145) "Uptime: 1641927 Threads: 5 Questions: 39681591 Slow queries: 0 Opens: 1132 Flush tables: 1 Open tables: 235 Queries per second avg: 24.168"
go

这变得很奇怪,非常非常奇怪!


更新 #2

CREATE TABLE IF NOT EXISTS `panier_paniers` (
  `no_panier` bigint(20) unsigned NOT NULL auto_increment,
  `client_prenom` varchar(100) NOT NULL default '',
  `client_nom` varchar(100) NOT NULL default '',
  `client_entreprise` varchar(150) default NULL,
  `client_adresse` varchar(150) NOT NULL default '',
  `client_ville` varchar(150) NOT NULL default '',
  `client_province_etat` char(2) default NULL,
  `client_pays` char(2) NOT NULL default '',
  `client_code_postal_zip` varchar(15) NOT NULL default '',
  `client_telephone` varchar(20) NOT NULL default '',
  `client_type_telephone` enum('domicile','travail','cellulaire') NOT NULL default 'domicile',
  `client_telecopieur` varchar(20) default NULL,
  `client_courriel` varchar(150) NOT NULL default '',
  `client_mailinglist_from` datetime default NULL,
  `client_langue` char(2) NOT NULL default '',
  `client_no_client` bigint(20) unsigned default NULL,
  `expedition_mode` varchar(20) NOT NULL default '',
  `expedition_no_livraison` bigint(20) unsigned default NULL,
  `expedition_produit` varchar(100) default NULL,
  `expedition_produit_no_compte` varchar(100) default NULL,
  `expedition_frais_livraison` decimal(10,2) NOT NULL default '0.00',
  `expedition_frais_manut` decimal(10,2) NOT NULL default '0.00',
  `expedition_assurance` char(1) NOT NULL default 'X',
  `expedition_signature` char(1) NOT NULL default 'X',
  `expedition_conf_livraison` char(1) NOT NULL default 'X',
  `expedition_emballage` text,
  `expedition_no_suivi` varchar(100) default NULL,
  `expedition_prenom` varchar(100) default NULL,
  `expedition_nom` varchar(100) default NULL,
  `expedition_entreprise` varchar(150) default NULL,
  `expedition_adresse` varchar(150) default NULL,
  `expedition_ville` varchar(150) default NULL,
  `expedition_province_etat` char(2) default NULL,
  `expedition_pays` char(2) default NULL,
  `expedition_code_postal_zip` varchar(15) default NULL,
  `expedition_telephone` varchar(20) default NULL,
  `expedition_type_telephone` enum('domicile','travail','cellulaire') NOT NULL default 'domicile',
  `expedition_exporte_ups_connect` char(1) NOT NULL default '',
  `expedition_mis_a_jour_ups_connect` char(1) NOT NULL default '',
  `paiement_mode` varchar(20) NOT NULL default '',
  `paiement_no_paiement` bigint(20) unsigned default NULL,
  `paiement_numero_taxe_fed` bigint(20) unsigned NOT NULL default '0',
  `paiement_numero_taxe_prov` bigint(20) unsigned NOT NULL default '0',
  `paiement_numeros_taxes_speciales` varchar(255) NOT NULL,
  `paiement_numero_po` varchar(20) default NULL,
  `paiement_numero_bon` varchar(20) default NULL,
  `paiement_cc_pa_trnid` varchar(10) default NULL,
  `paiement_cc_pa_montant` decimal(10,2) NOT NULL default '0.00',
  `paiement_cc_capture` text,
  `paiement_desjardins_TxID` varchar(25) default NULL,
  `paiement_desjardins_date_envoi` datetime NOT NULL default '0000-00-00 00:00:00',
  `date_creation` datetime NOT NULL default '0000-00-00 00:00:00',
  `ip_creation` varchar(15) NOT NULL default '',
  `host_creation` varchar(255) default NULL,
  `date_vente` datetime NOT NULL default '0000-00-00 00:00:00',
  `date_annulee` datetime NOT NULL default '0000-00-00 00:00:00',
  `date_completee` datetime NOT NULL default '0000-00-00 00:00:00',
  `date_inventaire` datetime NOT NULL default '0000-00-00 00:00:00',
  `date_acceptation` datetime NOT NULL default '0000-00-00 00:00:00',
  `note` text,
  `note_client` text,
  `no_utilisateur` bigint(20) unsigned default NULL,
  PRIMARY KEY  (`no_panier`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=841 ;

更新 #3

好的,看这个可怕的东西:

//Marque le panier comme vendu
$sqlstring = 'UPDATE panier_paniers SET date_vente = NOW() WHERE no_panier = '.$data_panier["no_panier"];
$result = mysql_query($sqlstring, $conn_panier);
echo $sqlstring.'<br>';
echo mysql_affected_rows($conn_panier); echo '<br>';
echo mysql_error($conn_panier); echo '<br>';
echo mysql_errno($conn_panier); echo '<br>';
var_dump($conn_panier); echo '<br>';
var_dump(mysql_error($conn_panier)); echo '<br>';
var_dump(mysql_info($conn_panier)); echo '<br>';
var_dump(mysql_stat($conn_panier)); echo '<br>';

$sqlstring='UPDATE panier_paniers SET date_vente  = "2011-12-28 10:09:12" WHERE no_panier = '.$data_panier["no_panier"];
mysql_query($sqlstring, $conn_panier);
echo $sqlstring.'<br>';
echo mysql_affected_rows($conn_panier); echo '<br>';
echo mysql_error($conn_panier); echo '<br>';
echo mysql_errno($conn_panier); echo '<br>';
var_dump($conn_panier); echo '<br>';
var_dump(mysql_error($conn_panier)); echo '<br>';
var_dump(mysql_info($conn_panier)); echo '<br>';
var_dump(mysql_stat($conn_panier)); echo '<br>';

如您所见,这两种方法都是有效的,第一种不会更新任何内容,第二种会更新该行。请交换位置并再次进行测试:

$sqlstring='UPDATE panier_paniers SET date_vente  = "2011-12-28 10:09:12" WHERE no_panier = '.$data_panier["no_panier"];
mysql_query($sqlstring, $conn_panier);
echo $sqlstring.'<br>';
echo mysql_affected_rows($conn_panier); echo '<br>';
echo mysql_error($conn_panier); echo '<br>';
echo mysql_errno($conn_panier); echo '<br>';
var_dump($conn_panier); echo '<br>';
var_dump(mysql_error($conn_panier)); echo '<br>';
var_dump(mysql_info($conn_panier)); echo '<br>';
var_dump(mysql_stat($conn_panier)); echo '<br>';

//Marque le panier comme vendu
$sqlstring = 'UPDATE panier_paniers SET date_vente = NOW() WHERE no_panier = '.$data_panier["no_panier"];
$result = mysql_query($sqlstring, $conn_panier);
echo $sqlstring.'<br>';
echo mysql_affected_rows($conn_panier); echo '<br>';
echo mysql_error($conn_panier); echo '<br>';
echo mysql_errno($conn_panier); echo '<br>';
var_dump($conn_panier); echo '<br>';
var_dump(mysql_error($conn_panier)); echo '<br>';
var_dump(mysql_info($conn_panier)); echo '<br>';
var_dump(mysql_stat($conn_panier)); echo '<br>';

结果:

UPDATE panier_paniers SET date_vente = "2011-12-28 10:09:12" WHERE no_panier = 840
1

0
resource(5) of type (mysql link)
string(0) ""
string(40) "Rows matched: 1 Changed: 1 Warnings: 0"
string(145) "Uptime: 1643141 Threads: 5 Questions: 39713580 Slow queries: 0 Opens: 1286 Flush tables: 1 Open tables: 219 Queries per second avg: 24.169"
UPDATE panier_paniers SET date_vente = NOW() WHERE no_panier = 840
1

0
resource(5) of type (mysql link)
string(0) ""
string(40) "Rows matched: 1 Changed: 1 Warnings: 0"
string(145) "Uptime: 1643141 Threads: 5 Questions: 39713581 Slow queries: 0 Opens: 1286 Flush tables: 1 Open tables: 219 Queries per second avg: 24.169" 

现在两个更新都起作用了...我尝试进行验证、修复和优化以查看是否存在损坏问题,但没有任何改变...

3
你在你最喜欢的MySQL客户端中运行查询语句,它是否有效?确切的列类型是什么? - Álvaro González
2
连接使用的用户是否具有更新该表的权限? - ypercubeᵀᴹ
ypercube:是的,我很少使用表/列特定的权限。 - Mathieu Dumoulin
1
仅用于测试目的,当您提供类似SET date_vente='2011-12-28 12:00:00'这样的日期字符串时会发生什么? - VolkerK
2
嗯,有点有趣又有点毛骨悚然... a) 当你使用 SYSDATE()Curdate() 而不是 Now() 时会发生什么?通过 php 和 heidisql 执行查询语句 "SELECT Now() as now, date_vente FROM panier_paniers WHERE no_panier=840" 的结果是什么? - VolkerK
显示剩余25条评论
1个回答

1

所以问题最终是逻辑和糟糕编码实践的问题。问题来自于之前的程序员喜欢没有结构并将代码放在奇怪的地方。我在我们寻找的范围之外找到了错误。

我想说,如果你遇到这样的错误,请查找代码中的缺陷,其中一个相同的查询可能会在当前看似失败的查询之前执行。这将为您节省数小时的麻烦,寻找与手头问题无关的解决方案。


4
建议进行隔离测试的同事,给他/她买杯饮料。 - ethrbunny
你可以添加指向 UPDATE 文档的链接以及 “如果您将列设置为其当前值,MySQL 会注意到这一点并不会更新它。” 这意味着,如果您的 Update 语句找到匹配的行但未对其进行更新,则最好查找其他代码(在您之前运行或触发器)也可能正在进行更新。 - ypercubeᵀᴹ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接