2017-11-30 2 views
1

내 사이트는 자선 단체 기부금을 허용합니다. 사람들이 기부하면 지원 메시지와 함께 기부금이 기부 페이지에 표시됩니다.MySQL 데이터베이스의 PHP 이중 데이터베이스 항목

두 가지 문제점이 있습니다.

  1. 문제는 때때로 아니라 기부 그들은뿐만 아니라 프런트 엔드에 두 번 보여 의미 데이터베이스에 두 번 입력 한 모든 시간. 다음은

    Screenshot of double entry on the front end

    Screenshot of double database entry with same transaction id

는 데이터베이스에 기부 "환호"메시지를 추가하는 코드입니다. 엔트리가 왜 두 번 발생하는지 항상 알 수는 없지만 항상 그런 것은 아닙니다. 타임 스탬프를 보면 항목이 분 단위로 표시되므로 사용자가 페이지를 새로 고칠 수 있다고 생각했지만이를 방지하는 방법을 모르겠습니다.

  1. 문제점 : 사이트에서 wp 전자 상거래 플러그인을 사용하여 기부를 처리합니다. 기부금은 wp eCommerces 구매 로그에 추가되지만 기부액이 누락되었습니다.

Screenshot of purchase log with missing donation amounts

나는 기부금을 처리하기 위해 워드 프레스 4.8.4과 wp eCommerce을 사용하고. PHP 버전 : 5.6.27 데이터베이스 클라이언트 버전 : libmysql - 5.1.73

기부금이 제대로 대부분의 시간을 입력하지만,이 두 항목이 날 미친 운전하고 일이 왜 알아낼 수 없습니다. 더 많은 지식을 가진 사람이 도움이되기를 바랍니다. 미리 감사드립니다.

아래는 기부금을 데이터베이스 및 구매 로그에 추가하는 코드입니다. 코드의 주석은 플러그인 개발자와 저의 의견입니다. 나는 원래 개발자에게 다가 갈 수 없으므로 이것을 직접 처리하려고한다. 나는 웹 디자이너에 가깝지만 php와 mysql에 대한 기본적인 지식을 가지고있다.

/** Function to add cheers when transaction is completed **/ 

function kd_add_cheers() { 
global $wpdb; 
global $kd_table; 
$prefix = $wpdb->prefix; 
$stamp = $_GET['STAMP']; 
$session = $_GET['sessionid']; 
$transaction = $stamp.$session; 
$t1 = $prefix."wpsc_submited_form_data"; 
$t2 = $prefix."wpsc_purchase_logs"; 
$t3 = $kd_table; 
$t4 = $prefix."postmeta"; //remove if doesnt work edit by oliver 

// Set these in production!!! 

$firstname_field = '2'; 
$lastname_field = '3'; 
$message_field = '22'; 
$recipient_field = '29'; 
$price_field = '19'; 
$anonymous_field = '23'; 



$sql = "SELECT * FROM ".$t3." WHERE `transaction`=".$transaction; 
$cheers = $wpdb->get_results($sql); 

// Make sure this transaction gets submitted only once 
// (To prevent page refresh re-injection) 
if (empty($cheers)) { 
    $sql = " 
     SELECT ".$t1.".form_id, ".$t1.".value FROM ".$t1." 
     INNER JOIN ".$t2." 
     ON ".$t1.".log_id = ".$t2.".id 
     WHERE ".$t2.".sessionid = ".$session." 
     AND ".$t2.".id = ".$stamp; 

    $posts = $wpdb->get_results($sql); 
    if (!empty($posts)) { 

     $insert = array(); 
     $insert['transaction'] = $transaction; 


     foreach ($posts as $post) { 
      $insert['field_'.$post->form_id] = $post->value; 
      $insert['field_price'] = $post->totalprice; 
     } 

     if ($insert['field_'.$recipient_field] != '' && trim($insert['field_'.$recipient_field]) != '') { 


      if (isset($insert['field_'.$anonymous_field]) && $insert['field_'.$anonymous_field] == 'Kyllä') { 
       $donator = ''; 
      } 
      else $donator = $insert['field_'.$firstname_field]." ".$insert['field_'.$lastname_field]; 

      $msg = esc_attr($insert['field_'.$message_field]); 
      $msg = str_replace(':', '', $msg); 
      $msg = str_replace(';', '', $msg); 
      $msg = str_replace('"', '', $msg); 
      $msg = str_replace(')', '', $msg); 
      $msg = str_replace('(', '', $msg); 

      $sql = "INSERT INTO ".$t3." (`from`, `content`, `for`, `transaction`, `price`) VALUES 
      ('".esc_attr($donator)."', '".$msg."', '".$insert['field_'.$recipient_field]."', '".$insert['transaction']."', '".$insert['field_'.$price_field]."')"; 
      $inserted = $wpdb->get_results($sql); 

      if ($inserted) return true; 

     } 

    } 
} 
} 

function kd_update_transaction_status() { 
global $wpdb; 
$prefix = $wpdb->prefix; 
$stamp = $_GET['STAMP']; 
$session = $_GET['sessionid']; 
$table = $prefix."wpsc_purchase_logs"; 

$sql = "UPDATE ".$table." SET `processed`=2,`email_sent`=1 WHERE `sessionid` = '".$session."' AND `id` = '".$stamp."'"; 

$inserted = $wpdb->get_results($sql); 
if ($inserted) return true; 

} 

답변

0

두 번째 질문은 워드 프레스에 대해 충분히 알지 못하기 때문에 대답 할 수 없습니다. 하지만 첫 번째 문제에 대해 한 두 가지를 볼 수 있습니다.

우선 중복 항목이 사이에 삽입 된 인 것으로 나타났습니다. 즉,이 스크립트는 두 번 실행되었으므로 $cheers이 항상 비어 있으므로 $ kd_table에 새 항목이 삽입됩니다.

이제 왜 $ cheers가 비어 있는지 물어볼 수 있습니까? 쿼리가 올바르지 않기 때문입니다. WHERE 절에 $transaction 값을 작은 따옴표로 묶지 않았습니다. 이것에

변경이

$sql = "SELECT * FROM ".$t3." WHERE `transaction`=".$transaction; 

을 :

$sql = "SELECT * FROM ".$t3." WHERE `transaction`='".$transaction."'"; 

과 두 번째로이 스크립트를 호출 할 때 $cheers가 비어 있지 않은 경우 확인합니다.

+0

와우. 고맙습니다! 나는 그렇게 빨리 반응 할 것이라고 생각하지 않았다. 제안한 코드를 변경했습니다. 사이트에서 기부금을 성공적으로 받으면 내 질문의 상태를 업데이트합니다. Stackoverflow에는 정말 멋진 커뮤니티가 있습니다. 다시 한번 감사드립니다. – Oliver

+0

당신을 진심으로 환영합니다. 나는이 문제에 포함되지 않은 버그를 유발할 수있는 뭔가가 될 수 있기 때문에 스스로 테스트 해 볼 것을 제안합니다. 트랜잭션 열은 정수이고 위에서 언급 한 이러한 작은 따옴표가 필요하지 않을 수 있습니다. Stackoverflow에 오신 것을 환영합니다 :) – Cashbee

+0

내가 확인하고 트랜잭션 열은 varchar로 정의됩니다. 아래는 플러그인 설치 부분의 코드입니다. – Oliver

관련 문제