2010-02-15 3 views
3

내 스크립트를PHP 영향을받는 행 제대로

<?php 
ob_start(); 
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past 
header('Content-type: text/html; charset=utf-8'); 
include "tilslut.php"; 
$userid = $_GET["userid"]; 
$s = mysql_query("SELECT points, lastpoint FROM member_profile WHERE user_id = '".$userid."'"); 
$n = mysql_fetch_array($s); 
$tid = time(); 
mysql_query("UPDATE member_profile set points = points+1, lastpoint=$tid WHERE lastpoint<=$tid-60 AND user_id = '".$userid."'"); 
$e = mysql_query("SELECT points FROM member_profile WHERE user_id = '".$userid."'"); 
$f = mysql_fetch_array($e); 
if (mysql_affected_rows() == 1) { 
$s = mysql_query("SELECT points FROM member_profile WHERE user_id = '".$userid."'"); 
$n = mysql_fetch_array($s); 
?> 
Inserted! 
<? 
}else{ 
echo "Already got"; 
} 
ob_flush(); 
?> 

내가 포인트를주는이 있습니다. 업데이트 쿼리가 작동하며 마지막 위치가 < = time() - 60 인 경우에만 포인트를 제공하지만 삽입하지 않아도 "삽입 됨"이라고 계속 말합니다. 영향을 받았는지 여부를 확인하기 위해 mysql-affected-rows를 사용하려고 시도했지만이 기능이 작동하지 않는 것 같습니다.

+6

가 불행하게도 이름 :-(유지하기 위해 더 열심히 코드를 만든다. –

+0

포함 파일은 db 연결 – Karem

+0

@Anon입니다. - 적어도 "l"로 시작하지 않습니다. – JAL

답변

3

다른 선택을하기 전에 업데이트 직후에 mysql_affected_rows를 호출해야합니다. mysql_affected_rows는 연결에서 수행 된 마지막 쿼리에서만 작동합니다.

$e = mysql_query("SELECT points FROM member_profile WHERE user_id = '".$userid."'"); 

1

Youru 쿼리는 동일 하나에 영향을 줄을 야기한다. 나는 즉시 업데이트 후 영향을받는 행에 대해 확인하시기

+0

답장을 보내 주셔서 감사합니다.하지만 이미 첫 번째 답변을 수락했습니다. 이는 귀하와 같은 해결책입니다. – Karem

3

당신은 다음과 같습니다

  • mysql_affected_rows
를 호출 만 다음, select 쿼리
  • 을하고, 다음 update 쿼리
  • 를하고

    update 쿼리 바로 뒤에 mysql_affected_rows을 호출하는 것이 더 효과적 일 수 있습니다. 그 중 다른 쿼리없이 : mysql_affected_rows은 마지막 쿼리의 데이터로 작업해야합니다. - 설명서에 select 개의 쿼리에 대한 내용이 없더라도 문제가 발생할 수 있습니다. 사이드 참고로


    : 당신은 SQL 주입의 몇 가지 위험이 여기에 : 당신은 SQL 쿼리 에 주입하기 전에 데이터를 탈출해야한다, 적어도 (나는 약 $_GET["userid"]를 생각하고), 또는 정수인지 확인하십시오.


    그리고 당신은 더 설명 변수 이름을 사용한다 : $e는, $f는, $n는, $s는 ...이 읽기/이해/파일을 포함

  • +0

    답장을 보내 주셔서 감사합니다. 그러나 저는 이미 귀하와 같은 해결책이었던 첫 번째 답변을 수락했습니다. 귀하의 메모에 감사 드리며, 저는 알고 있습니다. 이미 그 스크립트를 테스트하고 있습니다. – Karem

    +0

    아무런 문제가 없으며 귀하의 의견을 주셔서 감사합니다 :-) 나는 도망 칠 수있는 몇 가지 단어가 결코 해를 끼칠 수는 없지만 :-) –

    +0

    "문서가 선택 검색어에 대해 말하지 않습니다"- SELECT 쿼리는 문제의 행에 영향을 미치지 않습니다 SELECT는 읽기 전용이므로 따라서 SELECT 쿼리의 영향을받는 행 수는 예상대로 0입니다. – Piskvor

    관련 문제