2012-12-20 6 views
-1

신뢰할 예기치 않은 결과. 때로는 100 씩 증가 시키며 때로는 전혀 업데이트하지 않는 경우도 있습니다.이 같은 PHP에서 MySQL로 값을 보낼 때 PHP와보다 큰 100 조는

$stmt->prepare("update bank set cash = ?"); 
$stmt->bind_param('i',$new_cash_amt); 
$stmt->execute(); 
+1

'$ mysqli-> 쿼리 ($ 금액 '업데이트 player_stats 현금 = 현금 + 설정' '어디에 사용자 이름 = "cheater2"'.); ' –

+0

db에서 지정한 int 또는 데이터 유형의 크기는 얼마입니까? –

+0

내가 내 질문에 fubar'd 것 같습니다. mt_rand를 사용하여 변수를 얻은 다음 add_cash()로 보내면 10 또는 100의 간헐적 인 증분 만 업데이트됩니다. 유형에 문제가 있는지 궁금합니다. 이상하게도 다른 변수를 사용하여 add_cash를 실행하면이 문제가 발생하지 않습니다. 내 질문을 업데이트하고 있습니다. – Nelson

답변

3
  1. 사용 따옴표 :

    준비된 문은 숫자가 몇 억보다 큰 도착하면 다른,하지만 신뢰할 수없는 결과가 있습니다.

  2. or die(mysql_error());을 사용하여 버그를 확인하십시오.
  3. mysql * 기능 사용을 중지하면 곧 중단 될 예정입니다.

수정 :

$amount = 17; 
$mysqli->query(" 
     update player_stats 
     set cash = cash + $amount 
     where username = 'cheater2' 
") or die(mysql_error()); 
+0

이것은 효과가 있지만 이유는 모르겠습니다. 이것이 준비된 성명서에있을 때도 같은 문제가 있습니다. – Nelson

+0

왜? 내 지점 2. 귀하의 쿼리를 실행하고 mysql 오류가 나타납니다 ... –

+0

글쎄, 이런. 쿼리를 직접 실행하면 내 게임의 add_cash 함수를 통해 실행할 때 작동합니다. 이것은 낯선 사람이되고있다. 그것은 단지 100 조 이상의 값을 깨기 때문입니다. add_cash 함수로 질문을 업데이트했습니다. – Nelson

1

당신은 늘 PHP는 변수를 구문 분석 작은 따옴표를 사용하고 있습니다. cash=cash+$amount을 문자열로 찾고 데이터를 보유하는 변수가 아닙니다.

0

여기 내 자신의 질문에 대답하고 있습니다.

그것은 당신이 이런 식으로 값을 전달할 때 밝혀 :

huge_number입니다 : 1.0000000000001E + 17

정확한을

$huge_number = 100000000000; 
echo "The huge_number is: $huge_number"; 

그것은 다음을 인쇄합니다 값은이 변환에서 손실됩니다. 그래서 100의 배수로 값이 증분되는 경우가 있으며 다른 경우에는 그렇지 않습니다.

준비된 문과 마찬가지로 32 비트 정수보다 큰 값 (바인딩 된 매개 변수의 형식으로 'i'를 붙인 이후)은 예기치 않게 잘리고 변경됩니다. 그래서처럼 'D'로 새 값을 통과해야합니다.

$stmt->bind_param('d',$new_cash_amt); //This works correctly