【问题标题】:Database contents setting themselves to 0数据库内容将自己设置为 0
【发布时间】:2011-02-10 06:53:42
【问题描述】:

我有一个包含 4 个表的数据库,但是我正在使用其中 1 个与其他表分开。

在这个表中,我有 4 个字段是 varchar,其余是整数(11 个其他字段),当用户填写数据库时,所有内容都会正确保存,但是到目前为止,数据库值已经发生了 3 次int 在没有任何明显原因的情况下重置为 0。起初,我想,这是因为那些字段(数字应该去哪里)是 varchars 而不是 ints。然而,自从我改变了它,它又发生了。我已经仔细检查了我的代码,我什至没有更新或插入 0 值。此外,我正在使用 codeigniter 和活动记录来防止 SQL 注入并启用 XSS 过滤,有人能指出我可能遗漏的东西或发生这种情况的原因吗?

另外,我很确定这个问题的答案,但是有没有办法恢复一些数据?除了必须要求每个人再次填写所有内容.. =/

** 编辑 **

存储引擎是 MyISAM,排序规则是 latin1_swedish_ci,Pack Keys 是默认值,出于所有意图和目的,它是一个普通数据库

** 编辑 **

这是我的表结构

-- phpMyAdmin SQL Dump
-- version 3.3.5
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Feb 10, 2011 at 09:31 AM
-- Server version: 5.0.51
-- PHP Version: 5.2.14

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `cinesdec_prueba`
--

-- --------------------------------------------------------

--
-- Table structure for table `Oscar`
--

CREATE TABLE IF NOT EXISTS `Oscar` (
  `Id` int(20) NOT NULL auto_increment,
  `Nombre` varchar(100) default NULL,
  `ApPaterno` varchar(100) default NULL,
  `ApMaterno` varchar(100) default NULL,
  `Edad` varchar(25) default NULL,
  `Twitter` varchar(250) default NULL,
  `Correo` varchar(250) NOT NULL default '',
  `BestPicture` int(10) unsigned NOT NULL,
  `ActorLead` int(10) unsigned NOT NULL,
  `ActorSupport` int(10) unsigned NOT NULL,
  `ActressLead` int(10) unsigned NOT NULL,
  `ActressSupport` int(10) unsigned NOT NULL,
  `Art` int(10) unsigned NOT NULL,
  `Directing` int(10) unsigned NOT NULL,
  `Foreing` int(10) unsigned NOT NULL,
  `Music` int(10) unsigned NOT NULL,
  `Visual` int(10) unsigned NOT NULL,
  `Desempate` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`Correo`),
  UNIQUE KEY `Id` (`Id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=89 ;

【问题讨论】:

  • 设置全局 general_log = 'ON';并查看有关他运行的查询的日志
  • 这是一个租用的服务器,我没有root权限,但我会请管理员帮助我=/

标签: php mysql database codeigniter


【解决方案1】:

根据您的描述,您的字段默认值为 0。

您可能已经创建了带有默认值的表,如下所示:

`[column_name]` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'

要删除默认值,请执行以下操作:

ALTER TABLE `[table_name]` CHANGE `[column_name]` `[column_name]` INT( 10 ) UNSIGNED NOT NULL;

这将删除默认的 0 值(注意删除 DEFAULT '0')。

您看到 0 的原因:当默认值为 0 时,如果您的 INSERT 语句不包含该字段,MySQL 只会将默认值插入该字段。 p>

我猜你用来创建表的软件会自动添加 0 值,这通常不是问题,因为任何相关表的 id 都会从 1 开始,这是整数值的最常见值。

【讨论】:

  • 我试图运行它我得到一个语法错误,我不确定我在哪里很抱歉我明确地问但我对处理数据库真的很生疏,如果这通常不是问题,为什么现在会影响我? (只是寻找解释为什么会这样)
  • 看看我的“你看到 0 的原因”
  • 语法错误,是不是改了表名和列名?我刚刚添加了一些占位符。
  • 是的,我唯一能看到的区别是,在每个 column_name 之间我有一个由 phpmyadmin 本身添加的逗号,但是我也尝试不使用逗号,这是我的查询(` 没有出现是因为当我写评论时它是如何解析的,但它们在那里)ALTER TABLE Oscar CHANGE BestPictureActorLeadActorSupportActressLeadActressSupportActressSupportArt,@9876543325@,@9876 @、MusicVisualDesempate INT(10) 无符号非空
  • 如果可能的话,如果您将完整的表结构添加到您的问题中,这也可能会有所帮助。
【解决方案2】:

你用的是什么SQL_MODE?您至少需要 STRICT_ALL_TABLES 但 TRADITIONAL 和 ANSI 可能会更好地获得可靠的数据库。

SET SESSION sql_mode='traditional,ansi';
SELECT @@SESSION.sql_mode;

【讨论】:

  • 我有 SQL_MODE="NO_AUTO_VALUE_ON_ZERO";会有问题吗?
  • 我认为这不会改变任何事情,NO_AUTO_VALUE_ON_ZERO 是关于 auto_increment 而不是其他字段。
猜你喜欢
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 2019-01-03
  • 2012-08-05
  • 1970-01-01
  • 2012-04-20
相关资源
最近更新 更多