2013-10-28 1 views
1

우선, 죄송합니다. 일부 죄송 합니다만 영어로 작성하지 않으므로 조금 힘듭니다. 둘째로, 저는 프로그래머로서의 초보자입니다. 아마도 제 질문은 너무 쉽습니다. (나는 여기서 대답하기 전에 대답을 찾으려고 노력했습니다.)오류 : 1265 SQLSTATE : 01000 (WARN_DATA_TRUNCATED)

글쎄, 나는 php와 mysql을 연습하고 싶다. 그래서 bbdd와 GUI로 제어하려고한다.

MySQL을 (v5.6.12) :

CREATE TABLE IF NOT EXISTS `personaje` (

`id_personaje` int(3) NOT NULL AUTO_INCREMENT, 
`nombre` varchar(30) NOT NULL, 
`servidor` varchar(25) NOT NULL, 
`nivel` int(3) NOT NULL, 
`faccion` varchar(10) NOT NULL, 
`clase` varchar(25) NOT NULL, 
`raza` char(30) NOT NULL, 
`profesion1` varchar(20) NOT NULL, 
`nivel1` int(4) NOT NULL, 
`profesion2` varchar(20) NOT NULL, 
`nivel2` int(4) NOT NULL, 
`nivel_coc` int(4) NOT NULL, 
`nivel_pes` int(4) NOT NULL, 
`nivel_arqu` int(4) NOT NULL, 
`nivel_prim` int(4) NOT NULL, 

PRIMARY KEY (`id_personaje`), 
UNIQUE KEY `raza` (`raza`), 
UNIQUE KEY `clase` (`clase`), 
UNIQUE KEY `prof1` (`profesion1`), 
UNIQUE KEY `prof2` (`profesion2`), 
UNIQUE KEY `faccion` (`faccion`) 
) 
ENGINE=InnoDB 

PHP (v5.4.12) :

<?php 


    //Recoger los datos que llegan 

    $nombre = $_POST['nombreChar']; 
    $raza = $_POST['razaChar']; 
    $clase = $_POST['claseChar']; 
    $servidor = $_POST['servidorChar']; 
    $faccion = $_POST['faccionChar']; 
    $nivel = $_POST['nivelChar']; 
    settype($nivel,"int"); 
    $prof1 = $_POST['prof1Char']; 
    $lvlpr1 = $_POST['lvlpr1Char']; 
    $prof2 = $_POST['prof2Char']; 
    $lvlpr2 = $_POST['lvlpr2Char']; 
    $nivel_coc = $_POST['nivel_cocChar']; 
    $nivel_arqu = $_POST['nivel_arquChar']; 
    $nivel_pes = $_POST['nivel_pesChar']; 
    $nivel_prim = $_POST['nivel_primChar']; 
    $muestra = gettype($nivel); 

    //Conectandonos con la base de datos 
    $conexion = mysql_connect(/* ... */); 
    mysql_select_db (/* ... */, $conexion) OR die ("No se puede conectar"); 

    //Comprobar que no haya otro personaje repetido 
    /* $Consulta_per = "SELECT nombre, servidor FROM personaje WHERE nombre = 
     '".$nombre."' && servidor = '".$servidor."'"; 
    $busqueda = mysql_query($Consulta_per,$conexion) or die ("Error en busqueda " . mysql_error());  
    if (!$busqueda) 
     */ 
    $res = mysql_query("INSERT INTO personaje (nombre, servidor, nivel, faccion, 
     clase, raza, profesion1, nivel1, profesion2, nivel2, nivel_coc, 
     nivel_pes, nivel_arqu, nivel_prim) VALUE ('$nombre','$servidor', 
      '$nivel,','$faccion','$clase','$raza','$prof1','$lvlpr1', 
       '$prof2','$lvlpr2','$nivel_coc','$nivel_pes','$nivel_arqu', 
        '$nivel_prim')",$conexion) 
    or die ("No se pudo insertar " . mysql_error() ." ". $nivel . $muestra);// this line show the error 
    echo "Insertado con exito"; 
    mysql_close($conexion); 

    ?> 

제공되는 형식은 다음과 같습니다

저는 여기에 문제가있는 코드입니다
<FORM method="POST" action="crear-personaje.php"> 
     Nombre <INPUT type="text" name="nombreChar" id="nombreChar" value="Nombre"></br> 
     Raza <INPUT type="text" name="razaChar" id="razaChar" value="Raza"></br> 
     Facción <INPUT type="text" name="faccionChar" id="faccionChar" value="Facción"></br> 
     Clase <INPUT type="text" name="claseChar" id="claseChar" value="Clase"></br> 
     Servidor <INPUT type="text" name="servidorChar" id="servidorChar" value="Servidor"></br> 
     Nivel <INPUT type="number" name="nivelChar" id="nivelChar" value="1"></br> 
     Profesión 1 <INPUT type="text" name="prof1Char" id="prof1Char" value="Profesion1"></br> 
     Nivel de profesión 1 <INPUT type="text" name="lvlpr1Char" id="lvlpr1Char" value="1"></br> 
     Profesion 2 <INPUT type="text" name="prof2Char" id="prof2Char" value="Profesion2"></br> 
     Nivel de profesion 2 <INPUT type="text" name="lvlpr2Char" id="lvlpr2Char" value="1"></br> 
     Nivel cocina<INPUT type="text" name="nivel_cocChar" id="nivel_cocChar" value="1"></br> 
     Nivel pesca<INPUT type="text" name="nivel_pesChar" id="nivel_pesChar" value="1"></br> 
     Nivel primeros auxilios<INPUT type="text" name="nivel_primChar" id="nivel_primChar" value="1"></br> 
     Nivel arqueología<INPUT type="text" name="nivel_arquChar" id="nivel_arquChar" value="1"></br> 

     <INPUT type="submit" NAME="enviar" VALUE="Dar de alta!" id="enviar"> 

    </FORM> 

아파치 버전 2.4.4

모든 것이 잘되어야하지만 ... 아니야. "nivel"필드에 정수 값 (예 : 87 또는 1)을 삽입하려고하면 mysql에서 코드에 쓴 주석과 마찬가지로

"No se pudo insertar Data truncated for column 'nivel' at row 1 1integer"과 같은 오류를 표시합니다.

("no pudo insertar"는 "삽입 할 수 없음"을 의미합니다).

보시다시피, 변수 $ nivel을 정수로 지정 했으므로 PHP가 올바르게 인식합니다 (이것이 내가 die 문장에 $ nivel 및 $ muestra를 넣은 이유입니다). 나는 int (3)에서 Vivar (3) MySql에 유형 "nivel"변수를 변경해 보았습니다. 그리고 문자를 소개합시다. 그러나 ... int 형을 사용합니다 (문자의 수준은 정수입니다. obviusly).

누구든지 MySql에서이 오류를 제공하는 이유를 알고 계십니까? 이 문제를 해결하려면 어떻게해야합니까?

도움 주셔서 감사합니다.

$res = mysql_query("INSERT INTO personaje (nombre, servidor, nivel, faccion, 
     clase, raza, profesion1, nivel1, profesion2, nivel2, nivel_coc, 
     nivel_pes, nivel_arqu, nivel_prim) VALUE ('$nombre','$servidor', 
      '$nivel,', ... 

질문에 그냥 오타인가요 : 따옴표내부에 쉼표를 참고 - INSERT의 SQL에서

+0

SQL 명령은 현재 SQL 형식이 지시하는대로 변환 할 수 있습니다. 이 경우'sql' 명령에'sprintf'를 사용합니다. – Vector

답변

1

는 '$의 니벨를,'있어? 그렇지 않다면 MySQL이 '87,'을 정수로 변환하기 위해 고군분투하면서 오류의 원인이 될 수 있습니다.

+1

고마워. 나는 그렇게 간단하지 않다는 것을 믿을 수 없다 ... 다음에 나는 적어도 나의 코드를 적어도 200 번 읽었다. – UnnamedFreak

+1

문제는 아니지만, 그런 종류의 버그는 숨어있을 때 꽤 좋을 수 있습니다! 실제로 mysql_ * 함수를 더 이상 사용하지 않아야하며, mysqli_ *로 대체되었다는 것을 알고 있는지 확인하기 만하면된다. 또한 코드에서 SQL 주입 취약점을 확인해야합니다 (http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php 참조). – danielpsc

관련 문제