2013-09-06 3 views
0

같다 나는 다음과 같은 코드 유무 :PHP MySQL은 경우 다른 INSERT

<?php 
error_reporting(E_ALL); 

// connect to your MySQL database here 
$dbhandle = mysql_connect('xxx', 'xxxx', 'xxxx'); 
$selected = mysql_select_db("xxxx",$dbhandle); 

// Get the winner data 
function setWinner(){ 
    $sql = 'UPDATE user SET winner = 1 WHERE id=(SELECT id FROM user ORDER BY RAND())'; 
    $query = mysql_query($sql) or die (mysql_error()); 
    echo $query; 
} 
// Get the winner data 
function getWinner() 
{ 
    $sql = 'SELECT id, fullname, email, number FROM user WHERE winner = 1'; 
    $query = mysql_query($sql) or die (mysql_error()); 

    if(mysql_num_rows($query) == 1) { 
     $user = mysql_fetch_assoc($query); 

    } else { 
     // If there is no winner yet, automatically create one 
     setWinner(); 

     // Recall the function which should now find a winner 
     $user = getWinner();   
    } 


    return $user; 
} 
$winner = getWinner(); 
print_r($winner); 
?> 

이 g4vroche의 대답 작업을 시도하지만,이 오류가 점점 : 절에서 당신은 '사용자'를 목표 테이블을 지정할 수 없습니다 업데이트를

나는 이것을 데이터베이스에서 임의의 사용자를 선택하는 대회에 사용했지만 모든 사용자가 승자 열이 1 인 사용자가 있는지 확인해야하며 그렇지 않은 경우 무작위 사용자를 선택하고 그 사용자 우승자 열을 1로 업데이트하십시오.

도움을 주시면 감사하겠습니다.

+0

두 가지 검색어 만 사용하는 이유는 무엇입니까? 그건 잘 작동하고, 당신은 복잡한 중첩 된 쿼리를 사용하지 않아도됩니다. – Crontab

+0

왜냐하면 나는 어리 석다. :) 나는 두 개의 쿼리 경로를 시도했는데, 아마도 뭔가 잘못되었다. 몇 가지 예제 코드를 보여줄 수 있었습니까? –

+0

mysql_ *을 사용하지 말고 mysqli_ * 또는 PDO를 사용하기 시작해야합니다. mysql_ *가 이제는 더 이상 사용되지 않습니다.더 많은 것을 읽으십시오 : http://www.php.net/manual/en/function.mysql-query.php –

답변

1

사실은 무엇을 당신의 승자 열 저장 모르지만, 가정이 수도는 0 또는 1, 당신은 하나의 쿼리에서이 작업을 수행 할 수 있습니다 포함 부울,이다 :

SELECT id, fullname, email, number FROM user ORDER BY winner DESC, RAND() LIMIT 1; 

어느 것 :

  • 정렬 승자 = 1 F를 hanving 행을 승자 컬럼에있는 모든 기록,
  • 정렬이 "1"로

그래서 당신이 얻을 것이다 무작위 결과, 우선 순위가 승자 열을 가진 기록에 제공되는 동일() RAND 레코드를 동일 irsts.

수정

내가 잘못 생각했습니다.

현재

  • 두 개의 서로 다른 프로세스를 가져 오기 설정 승자
  • 당신은 아마 분할해야

승자가 두 개의 기능에/방법

// Get the winner data 
function getWinner() 
{ 
    $sql = 'SELECT id, fullname, email, number FROM user winner=1'; 
    $query = mysql_query($sql); 

    mysql_num_rows($result) == 1) { 
     $user = mysql_fetc_assoc($query);   
     return $user; 
    } 

    return false; 
} 

function setWinner() 
{ 
    $sql = 'UPDATE user SET winner=1 ORDER BY RAND() LIMIT 1'; 
    mysql_query($sql); 
} 

// Call this one time 
setWiner(); 

// Call this any time you want to get the winner's data 
$winner = getWinner(); 

더 게으른 접근 방식은 getWinner() 함수가 setwinner를 호출하도록 만들 것입니다. 아직 승자 : 귀하의 상황에 달려 있지만, 데이터 읽기 (getSomething)과 같은 함수가 어떤 상황에서, 또한 데이터를 변경하기 때문에보기의 일반 지점에가, (setWinner 나쁜 관행 전화 것

// Get the winner data 
function getWinner() 
{ 
    $sql = 'SELECT id, fullname, email, number FROM user winner=1'; 
    $query = mysql_query($sql); 

    mysql_num_rows($result) == 1) { 
     $user = mysql_fetc_assoc($query); 

    } else { 
     // If there is no winner yet, automatically create one 
     setWinner(); 

     // Recall the function which should now find a winner 
     $user = getWinner();   
    } 


    return $user; 
} 

().

+0

하지만 모든 승자는 처음부터 0이고 임의의 사용자를 선택해야합니다. 또한 승자 열을 1로 업데이트해야합니다. –

+0

오케이 그게 완전히 다른 두 가지 작업입니다. 내 대답 – g4vroche

+0

도움을 주셔서 감사합니다 :) –

2

예를 들어 사용했기 때문에 mysql_query() 함수를 사용하고 있습니다. PDO을 읽고 대신 구현해야합니다. 위 내 댓글 당

,

require_once "connect_to_mysql.php"; 
// look for records with `winner` set to 1 
$result = mysql_query('SELECT id, fullname, email, number FROM user WHERE winner = 1 LIMIT 1') or die (mysql_error()); 
if (mysql_num_rows($result) < 1) { // if no records were found, pick a random row 
    $result = mysql_query('SELECT id, fullname, email, number FROM user ORDER BY RAND() LIMIT 1'); 
} 
+0

두 번째 쿼리에서 찾지 못하면 승자 = 1을 설정하겠습니까? 아니면 –

+0

당신은'winner = 1 '두 번째 쿼리에서 발견 된 레코드 (첫 번째 쿼리에서 이미 반환 된 경우 이미 설정되어 있기 때문에)에 대한 문제입니다. 여기서 문제는 사용자 SET winner = 0을 업데이트하고 모든 사람의 "winner"상태를 다시 설정해야한다는 것입니다. 어떤 점에서 동일한 사용자가 반복해서 반환되지는 않습니다. – Crontab