2013-03-31 4 views
1

(죄송합니다, 내가 뭘하는지 잘 모르겠다.)mySQLi_affected_rows 검사가 작동하지 않거나 ...입니까?

페이스 북의 iframe에서이 동일한 게임을 동일한 디렉토리에있는 php 파일을 호출하면 그만큼 효과가 있습니다. 내가 원했던 것은 플레이어 기록이 있다면 거기에 있다면 업데이트하고, 그렇지 않다면 기록하는 것입니다.

이 스크립트는 실행되지만 항상 "여기가 아닙니다"를 반환하며 데이터베이스를 검사 할 때 실제로는 datetime 필드와 동일하지만 매번 레코드를 생성합니다. 그래서 affected_rows가 결코 "1"로 돌아 오지 않는 이유를 이해하지 못합니다.

<?php 
$db = @new mysqli('••.•••.•••.••', '•••••••••••', '••••••••','•••••••••••'); 
if ($db->connect_errno) 
{ 
echo("Connect failed "+mysqli_connect_error()); 
exit(); 
} 
$inIP = $_POST["ip"]; 
$playerIP = mysqli_real_escape_string($db, $inIP); 

$inUN = $_POST["un"]; 
$playerUN = mysqli_real_escape_string($db, $inUN); 

$query = "UPDATE lobby SET whens=NOW(), wherefores='$playerIP', whys=0 WHERE whos='$playerUN'"; 
mysqli_query($db, $query); 
if (mysqli_affected_rows($db) > 0) 
    { 
    echo "here"; 
    } 
else 
    { 
    $query2 = "INSERT INTO lobby (whens,whos,wherefores,whys) values (NOW(),'$playerUN','$playerIP',0)"; 
    mysqli_query($db, $query2); 
    echo "not here"; 
    } 

if ($db) 
    {  
    $db->close(); 
    } 
?> 
+0

왜 'INSERT INTO ... ON DUPLICATE KEY UPDATE ...'가 아닌가? 두 개가 아닌 하나의 쿼리? 그리고주의 : PHP의 연결 연산자는'.'입니다. 이것은 잘못되었습니다 :'echo ('connect failed'+ mysqli_connect_error())'. 또한 쿼리가 제대로 수행되었다고 가정하고 에로스를 억제합니다. ** 결코 성공을 가정하지 마십시오. –

+0

변수는 대/소문자를 구분합니다. error_reporting을 한 번 활성화하십시오. 그리고 이미 mysqli를 사용할 때는 준비된 문장을 고려해야한다. – mario

+0

'$ playerIP'와'$ playerip'가 오타 일 경우 스크립트는 SQL 삽입에 취약합니다. – Gumbo

답변

0

당신은 오타가 있습니다

wherefores=$playerip 

이 때문에 그

mysqli_affected_rows($db) 

반환의

wherefores=$playerIP 

해야

,
-1 
+0

고마워요,하지만 그 질문을 게시하고 해결 한 후에 그것을 보았습니다. 명백하게 그것은 문제가 아니었다. –

+0

변화 'mysqli_query ($ DB를, $ 쿼리);' 하고 문제가 – n1te

+0

뭐가 있는지,' 'mysqli_query ($ DB를, $ 쿼리) 또는 triger_error (mysqli_error의 ($ dB)) 에 중복 된 레코드 오류입니다. 나는 마크 B의 제안을 INSERT INTO ... 중복 키 업데이트에서 사용했다. (왜 그가 응답으로 게시하지 않았는지 모르겠다.) 오류는 이제 구문 오류이다. –

0

특히 내가 디버거를 통해 코드를 실행하는 경우와 같은 문제가 발생합니다. Netbeans과 Xdebug로이 문제를 조사했는데 이것이 MySQLi 확장 자체의 버그 인 것 같습니다. 에 따라 bug report이 만들어졌습니다. 그 동안에 다른 식을 대신 사용할 수도 있습니다 (예 :

if (mysqli_sqlstate($dbc) == 00000) { 
    //your code 
} 

) 나머지 코드를 계속 디버깅 할 수 있습니다.

관련 문제