2016-07-31 4 views
0

페이지가로드 된 후 PHP 변수를 할당/변경하는 방법이 있습니까? 예를 들어, 내가 변수 $username을 가지고 있다고 가정 해 봅시다. $username은 아직 설정되지 않았지만 사용자가 입력 필드가 $username 인 양식을 제출하면 설정됩니다. 따라서 본질적으로 $username$username = $_POST["username"];이됩니다. 사용자가 사용자 이름을 다시 변경하기로 결정했다고 가정 해 봅시다. (주의 : 페이지는 사용자 제출시 결코 새로 고쳐지지 않습니다. 같은 페이지입니다.) $ username은 $ _POST [ "username"]에 다시 할당됩니다. 이 현재의 방법론으로, 그것은 나를 위해 작동하지 않습니다. 나는 다음을 구성했다 :페이지를 새로 고치지 않고 PHP 변수를 변경하십시오.

$prevUsername; 
$newUsername; 

if ((isset($_POST["username"])) 
{ 
    $newUsername = $_POST["username"]; 

if ($username == "") 
{ 
    $db->query("INSERT INTO Users (`username`) VALUES ('$newUsername')"); 
    $prevUsername = $newUsername; 
} 

else 
{ 
    $db->query("UPDATE Users SET username = '$newUsername' WHERE username = '$prevUsername'"); 
    $prevUsername = $newUsername; 
} 
} 

사용자가 사용자 이름을 제출하면 올바르게 작동한다. 사용자가 사용자 이름을 업데이트하려고 할 때만 제대로 작동하지 않습니다. 사용자 이름을 업데이트해도 오류는 반환되지 않지만 이전 사용자 이름을 기반으로 업데이트되지 않습니다. 업데이트하는 대신 UPDATE SQL 문이 시작되지 않은 경우와 동일하게 유지됩니다. 이 문제를 해결할 방법이 있습니까? 세션 변수

:

session_start(); 
ob_start(); 

$_SESSION["username"]; 
if (isset($_POST["username"])) 
{ 
    if (isset($_SESSION["username"])) 
    { 
     $db->query("UPDATE Users SET username = '{$_POST['username']}' WHERE username = '{$_SESSION['username']}'"); 
    } 

    else 
    { 
     $db->query("INSERT INTO Users (`username`) VALUES ('{$_POST['username']}')"); 
    $_SESSION["username"] = $_POST["username"]; 
    } 
} 
+0

업데이트 쿼리? –

+1

이러한 요청은 완전히 다른 스크립트 실행으로 처리됩니다. 서로 다른 실행간에 값이 교환 될 것이라고 단순히 기대할 수는 없습니다. 이를 위해 세션을 사용해야합니다. 자세한 내용은 해당 설명서를 참조하십시오. – arkascha

+0

@arkascha 세션 변수를 사용하는 경우에도 동일한 결과를 얻습니다. 세션과 일반 변수를 모두 사용하여 시도했지만 두 가지 모두 제대로 작동하지 않는 것으로 보입니다. – user2896120

답변

0

stateless PHP가되고,이 요청을 완료 한 후 아무 서버의 메모리에 저장되지 않는 것을 의미한다. 다시 말해, PHP는 요청이있을 때마다 잃어 버리기 때문에 $prevUsername을 추적 할 수 없습니다. 더 영구적 인 변수에 변수를 저장하면됩니다. 세션 :

<?php 
    session_start(); 

    if (isset($_POST['username'])) { 
     if (!isset($_SESSION['prevUsername'])) { 
      $stmt = $db->prepare('INSERT INTO Users (`username`) VALUES (?)'); 
      $stmt->bind_param('s', $_POST['username']) 
      $stmt->execute(); 

      $_SESSION['prevUsername'] = $_POST['username']; 
     }else{ 
      $stmt = $db->prepare('UPDATE Users SET username = ? WHERE username = ?'); 
      $stmt->bind_param('s', $_POST['username']) 
      $stmt->bind_param('s', $_SESSION['prevUsername']) 

      $_SESSION['prevUsername'] = $_POST['username']; 
     } 
} 

그리고 당신은 아약스와 함께 사용하려는 경우 :

<html> 
    <head> 
     <meta charset="UTF-8" /> 
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
    </head> 
    <body> 
     <form method="POST"> 
      <input type="text" id="txt_username" /> 
      <input type="submit" id="btn_submit" /> 
     </form> 
     <hr /> 
     <div id="username"></div> 
     <div id="output"></div> 
     <hr /> 
     <script> 
      $(function() { 
       $('#btn_submit').on('click', function(e) { 
        e.preventDefault(); 
        request(); 
       }); 
       request(); 
      }); 
      function request() { 
       $.ajax({ 
        type: 'POST', 
        url: 'http://www.darkbee.be/stack/username/process.php', 
        data: {'username':$('#txt_username').val(),}, 
        dataType:'json', 
        success: function(e) { 
        $('#username').html('Current username:'+e.current_username); 
        $('#output').html('Action:'+e.message); 
        }, 
       });     
      } 
     </script> 
    </body> 
</html> 

process.php 값이에 $ prevUsername에 할당

<?php 
    session_start(); 
    $output = array(
     'current_username' => '', 
     'message'   => '', 
    ); 

    if (isset($_POST['username']) && trim($_POST['username']) != '') { 
     if (!isset($_SESSION['prevUsername'])) { 
      /* 
      $stmt = $db->prepare('INSERT INTO Users (`username`) VALUES (?)'); 
      $stmt->bind_param('s', $_POST['username']) 
      $stmt->execute(); 
      */ 

      $output['message'] = 'Tracked new username: '.$_POST['username']; 
      $_SESSION['prevUsername'] = $_POST['username']; 

     }else{ 
      /* 
      $stmt = $db->query('UPDATE Users SET username = ? WHERE username = ?'); 
      $stmt->bind_param('s', $_POST['username']) 
      $stmt->bind_param('s', $_SESSION['prevUsername']) 
      */ 

      $output['message'] = 'Changed old username from '.$_SESSION['prevUsername']. ' to '.$_POST['username']; 
      $_SESSION['prevUsername'] = $_POST['username']; 
     } 
    }else{ 
     $output['message'] = 'Nothing happend'; 
    } 
    if (isset($_SESSION['prevUsername'])) $output['current_username'] = $_SESSION['prevUsername']; 

    header('Content-Type: application/json'); 
    echo json_encode($output); 
+0

업데이트 된 질문으로 이와 같은 작업을 시도했습니다. 그러나 어떤 이유로 그것은 작동하지 않습니다 ... – user2896120

+0

또한 $ _SESSION [ 'newUsername']이 (가) 코드에 설정되지 않았으므로 기술적으로 $ _SESSION [ 'prevUsername']이 설정되지 않았습니까? – user2896120

+0

죄송합니다. 오타가 있었으므로'$ _POST [ 'username'];' – DarkBee

관련 문제