2012-06-04 2 views
-1

유형이 INTEGER (IN p_user_id INTEGER) 인 IN 매개 변수가있는 MySQL 저장 루틴이 있습니다. 사용자가 새로운 사용자를 생성하는 경우 p_user_id를 전달합니다. 그렇지 않으면 사용자가 사용자를 업데이트하는 경우 편집중인 사용자의 user_id를 전달합니다. 이 문제는 내 문제는 p_user_id가 "0"으로 변환 될 때입니다. PHP가 MySQL에 값을 보내고 (값이 '') 바로 사용자 ID를 덤프하고 오른쪽으로 덤프했습니다. MySQL 루틴의 시작 부분에 p_user_id가 0이되었습니다. p_user_id IN 매개 변수가 NULL이되도록 처리하는 방법에 대한 통찰력을 얻을 수 있습니까? 미리 감사드립니다!MySQL 정수 IN 매개 변수가 0으로 변환 중

PHP 코드 :

<?php 
session_start(); 

$functionCalled = $_GET['function']; 

function userMaintMerge() 
{ 
    $userMaintUserId = $_GET['userMaintUserId']; 
    $userMaintStep = $_GET['userMaintStep']; 
    $userMaintFirstName = $_GET['userMaintFirstName']; 
    $userMaintMI = $_GET['userMaintMI']; 
    $userMaintLastName = $_GET['userMaintLastName']; 
    $userMaintUserType = $_GET['userMaintUserType']; 
    $userMaintSchoolId = $_GET['userMaintSchoolId']; 
    $userMaintGrade = $_GET['userMaintGrade']; 
    $userMaintLogin = $_GET['userMaintLogin']; 
    $userMaintLogin = $_GET['userMaintPassword1']; 

    $mysqli = new mysqli($_SESSION['dbaddress'],$_SESSION['user'],$_SESSION['dbpword'],$_SESSION['database']); 
    if ($mysqli->connect_errno) 
    { 
     echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
    } 
    if (!$SelectUser = $mysqli->query("call MergeUser('$userMaintUserId','$userMaintStep','$userMaintFirstName','$userMaintMI','$userMaintLastName','$userMaintUserType','$userMaintSchoolId','$userMaintGrade','$userMaintLogin','$userMaintPassword1',@error)")) 
    { 
     echo "CALL failed: (" . $mysqli->errno . ") " . $mysqli->error; 
    } 
} 
?> 

MySQL의 저장 루틴 :

CREATE DEFINER=`root`@`localhost` PROCEDURE `MergeUser`(IN p_user_id  INTEGER 
,IN p_step   VARCHAR(10) 
,IN p_first_name VARCHAR(100) 
,IN p_mi   VARCHAR(5) 
,IN p_last_name VARCHAR(100) 
,IN p_user_type INTEGER 
,IN p_school_id VARCHAR(25) 
,IN p_grade  VARCHAR(2) 
,IN p_login  VARCHAR(25) 
,IN p_password  VARCHAR(25) 
,OUT p_error  VARCHAR(1) 
) 
BEGIN 

    insert into rjh_log values ('',p_user_id,sysdate()); 

    IF p_step = 'add' THEN 

     INSERT INTO USERS 
        (USER_ID 
        , LOGIN 
        , FIRST_NAME 
        , MI 
        , LAST_NAME 
        , USER_TYPE_ID 
        , GRADE 
        , SCHOOL_ID 
        , PASSWORD 
        , ACTIVE_FLAG 
        ) 
      VALUES (NULL 
        , p_login 
        , p_first_name 
        , p_mi 
        , p_last_name 
        , p_user_type 
        , p_grade 
        , p_school_id 
        , p_password 
        , 'Y' 
        ) ; 

    ELSE 

     UPDATE USERS 
      SET LOGIN = p_login 
      , FIRST_NAME = p_first_name 
      , MI = p_mi 
      , LAST_NAME = p_last_name 
      , USER_TYPE_ID = p_user_type 
      , GRADE = p_grade 
      , SCHOOL_ID = p_school_id 
      , PASSWORD = p_school_id 
     WHERE USER_ID = p_user_id; 

    END IF; 

END 
+0

포스트 코드. 어딘가에 문자열이 int로 캐스트되고 있습니다. 숫자로 시작하지 않는 문자열은 0으로 캐스팅됩니다. –

+0

@Michael @ 포함 된 코드로 질문을 편집했습니다. – Ryan

+0

검색어 매개 변수를 이스케이프 처리하지 않습니다. SQL 문을 피하기 위해 준비된 문이나 적절한 이스케이프 사용을 고려하십시오. –

답변

0
$userMaintUserId = ($_GET['userMaintUserId'] == "" ? "NULL" : $_GET['userMaintUserId']); 
$userMaintStep = ($_GET['userMaintStep'] == "" ? "NULL" : $_GET['userMaintStep']); 
$userMaintFirstName = ($_GET['userMaintFirstName'] == "" ? "NULL" : $_GET['userMaintFirstName']); 
$userMaintMI = ($_GET['userMaintMI'] == "" ? "NULL" : $_GET['userMaintMI']); 
$userMaintLastName = ($_GET['userMaintLastName'] == "" ? "NULL" : $_GET['userMaintLastName']); 
$userMaintUserType = ($_GET['userMaintUserType'] == "" ? "NULL" : $_GET['userMaintUserType']); 
$userMaintSchoolId = ($_GET['userMaintSchoolId'] == "" ? "NULL" : $_GET['userMaintSchoolId']); 
$userMaintGrade = ($_GET['userMaintGrade'] == "" ? "NULL" : $_GET['userMaintGrade']); 
$userMaintLogin = ($_GET['userMaintLogin'] == "" ? "NULL" : $_GET['userMaintLogin']); 
$userMaintLogin = ($_GET['userMaintPassword1'] == "" ? "NULL" : $_GET['userMaintPassword1']); 
관련 문제