2011-12-28 41 views
7

Tôi gặp sự cố lạ ở đây. Tôi đã cố gắng để tìm hiểu những gì sai trong vài giờ ngay bây giờ. Tôi đã có một chức năng mà nên cập nhật một bảng trong cơ sở dữ liệu của tôi và đặt "date_vente" (date_sold cho tiếng Anh) thành NOW(). Truy vấn rất đơn giản nhưng nó vẫn báo cáo 1 hàng phù hợp, 0 đã thay đổi.Truy vấn MySQL không cập nhật các hàng

Vấn đề là, dữ liệu phải được thay đổi. Nếu tôi chạy các truy vấn bằng tay, nó hoạt động tốt, nếu tôi chạy nó từ các ứng dụng php, nó không thành công ...

//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>'; 

Và đầu ra là

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 

Vấn đề là nó nên viết một giá trị của NGAY BÂY GIỜ cho bảng có chứa các giỏ nhưng nó không phải là. Và không, không phải do kết nối sai, cùng một id kết nối (var_dumped nó) được sử dụng trong hàm ngay trước đó, gọi nó và cả hai đều có cùng id, kết nối vẫn mở và có giá trị là "0000 -00-00 00:00:00 "trong cột tôi đang cố gắng cập nhật ...

Có ai có thể cho tôi thêm một số gợi ý để xem không?

Cảm ơn


CẬP NHẬT

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 

Đây là nhận lạ, RẤT rất lạ!


CẬP NHẬT # 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 ; 

CẬP NHẬT # 3

Ok, nhìn vào điều ma quái này:

//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>'; 

Như bạn có thể thấy, cả hai phải hợp lệ, cái đầu tiên sẽ không cập nhật gì cả, cái thứ hai sẽ cập nhật hàng. Chuyển sang xung quanh và kiểm tra một lần nữa:

$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>'; 

KẾT QUẢ:

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" 

Bây giờ cả cập nhật hoạt động ... Tôi đã cố gắng một xác minh, sửa chữa và tối ưu hóa để xem nếu nó không phải là một vấn đề tham nhũng, không có gì thay đổi ...

+3

Tính năng này có hoạt động nếu bạn chạy truy vấn trong ứng dụng khách MySQL yêu thích của mình không? Loại cột chính xác là gì? –

+0

Kiểu cột là DATETIME và có nó hoạt động nếu tôi chạy thủ công từ phpmyadmin hoặc heidisql ... Hãy nhớ rằng, nó kết thúc hàng, nó phù hợp với nó, do đó, nó không phải là một vấn đề kết nối sai ... –

+0

Xác suất của bạn xem là gì hồ sơ sai? –

Trả lời

1

Vì vậy, vấn đề là sau khi đã xảy ra sự cố với thực tiễn mã hóa và logic. Vấn đề đến từ các lập trình viên trước đây, những người không thích cấu trúc và đặt mã ở những nơi kỳ lạ. Tôi đã tìm thấy lỗi bên ngoài phạm vi của những gì chúng tôi đang tìm kiếm.

Tôi có thể nói, nếu bạn gặp phải lỗi như vậy, hãy tìm các lỗ hổng trong mã của bạn trong đó một truy vấn giống nhau có thể được thực hiện ngay trước khi truy vấn hiện tại bị hỏng. Điều đó sẽ giúp bạn tiết kiệm GIỜ của những rắc rối tìm kiếm một giải pháp mà không liên quan đến vấn đề ở bàn tay.

+4

Đồng nghiệp của bạn đề nghị thử nghiệm cách ly - mua cho anh ta một thức uống. – ethrbunny

+0

Bạn có thể thêm liên kết vào tài liệu 'UPDATE' và *' "Nếu bạn đặt cột thành giá trị hiện tại, MySQL sẽ thông báo và không cập nhật nó." '* Có nghĩa là nếu câu lệnh Update của bạn tìm thấy các hàng phù hợp nhưng không cập nhật chúng, hãy tìm kiếm mã khác tốt hơn (chạy trước mã của bạn hoặc trình kích hoạt) có thể cũng đang cập nhật. –

Các vấn đề liên quan