2015-05-13 2 views
0

Я довольно новичок в программировании на PHP, хотя я сделал несколько исследований (это то, что есть), я не вижу проблемы с моей операцией запроса. Кажется, есть так много способов написать запрос, который я потерял здесь. Имейте в виду, что у меня могут не быть лучших методов кодирования php. Я также пробовал синтаксис подготовки/выполнения Msqli, но ничего не происходило вообще, и у меня были сообщения об ошибках, и он даже не вводил оператор if для проверки количества строк, поэтому я, скорее всего, буду придерживаться текущего синтаксиса, который выполняется и регистрирует мои SuccessDB.log и FailDB.log. По крайней мере, я знаю, что он пытается это сделать.MySql Оператор обновления, не обновляющий базу данных

В моем приложении у меня есть страница прослушивания IP-адреса Paypal. Как только Paypal отправит запрос, я могу обработать его, но только на полпути. Однажды я подтвердил, что все переменные IPN в порядке, и оплата завершена и проверена, мне нужно обновить таблицу счетов в моей базе данных. Это окончательное обновление обработки, которое терпит неудачу.

Я пробовал все виды кода/запроса в течение двух дней подряд, и теперь я в недоумении. Помощь была бы оценена.

Проблематика оператор UPDATE (отрывок из всего кода):

$sql2 = "UPDATE payment_invoice SET p_user_name='$full_name', p_user_address='$address_and_state', p_user_postalcode='$address_zip', p_user_country='$address_country', p_datetime='$dateConverted', p_payment_completed='$p_payment_completed', p_user_email='$payer_email', p_paypal_txn_id='$txn_id' WHERE p_unique_invoice_id='$item_number'"; 

if ($conn->query($sql2) === TRUE) { 
    error_log(date('[Y-m-d H:i e] ') ."\r\n". "RECORDS UPDATED", 3, "./SuccessDB.log"); 
} else {   
    error_log(date('[Y-m-d H:i e] ') ."\r\n". "FAILED UPDATE", 3, "./FailDB.log"); 
} 
$conn->close(); 

Все детали Вселенной (цельная/частичный код):

<?php 
$host="localhost"; // Host name 
$username="myusername"; // Mysql username 
$password="mypass"; // Mysql password 
$db_name="mydbname"; // Database name 
$conn = null; 

//Connect to server and select database. 
$conn = new mysqli($host, $username, $password, $db_name); 

if ($conn->connect_errno) { 
    error_log($conn->connect_errno, 3, "error_log.txt"); 
} 

//**ADD CURL CODE HERE** 
//CURL code to catch paypal IPN request and Code to post validate back to paypal 
//I will skip this lenghty code, as the problem doesn't occur here 

$tokens = explode("\r\n\r\n", trim($res)); 
$res = trim(end($tokens)); 

if (strcmp ($res, "VERIFIED") == 0) { 

    //Initialize variables/Post variables  
    $payment_status = $_POST['payment_status']; 
    $transactionOK = false; 
    $p_total_amount = 0; 
    $p_payment_completed = 0; 
    $receiver_email = $_POST['receiver_email']; 
    $txn_id = $_POST['txn_id']; 
    if ($_POST['mc_gross'] != NULL){ 
     $payment_amount = floatval ($_POST['mc_gross']); 
    } 
    else{ 
     $payment_amount = floatval ($_POST['mc_gross1']); 
    } 
    $item_number = $_POST['item_number']; 
    $payment_currency = $_POST['mc_currency']; 
    $reason_code = $_POST['reason_code']; 
    $pending_reason = $_POST['pending_reason']; 
    $payment_type = $_POST['payment_type']; 
    $payer_id = $_POST['payer_id']; 
    $payer_status = $_POST['payer_status']; 
    $first_name = $_POST['first_name']; 
    $last_name = $_POST['last_name']; 
    $full_name = $first_name." ".$last_name; 
    $address_zip = $_POST['address_zip']; 
    $address_country = $_POST['address_country']; 
    $address_state = $_POST['address_state']; 
    $address_street = $_POST['address_street']; 
    $address_and_state = $address_street.", ".$address_state; 
    $payer_email = $_POST['payer_email']; 
    //Represent the unique random ID we created on click of buy button 
    $item_number = $_POST['item_number']; 
    date_default_timezone_set('PST'); 
    $payment_date = $_POST['payment_date']; 
    $dateTime = strtotime($payment_date); 
    $dateConverted = date('Y-m-d H:i:s', $dateTime);  
    $query = null; 
    $query_update = null;  
    $statement = null; 
    $statement_update = null; 
    $p_paypal_txn_id = "";  
    $res = null; 
    $results_update = null; 
    $nrows = null; 

    //Check to see if payment amount is higher than regular price of item 
    //We do this to detect if a user/hacker tried to tamper with page variables and try to buy 
    if($payment_amount > "21.95"){ 

     //Check to see if payment is Completed, if payment type is instant and if currency is Canadian dollar 
     if($payment_status == "Completed" && $payment_type == "instant" && $payment_currency == "CAD"){ 

      //THIS STATEMENT WORKS, THE CODE ENTERS THE ELSE STATEMENT AS INTENDED 
      //Check to see if the transaction ID has already been processed in my database 
      $sql = "SELECT * FROM payment_invoice WHERE p_paypal_txn_id=$txn_id"; 
      if ($conn->query($sql) === TRUE) { 
       error_log(date('[Y-m-d H:i e] ') ."\r\n". "TNX EXIST", 3, "./TnxAlreadyExist.log"); 
      } 
      } else { 

       try{ 
        $p_payment_completed = 1; 

        //This is the problematic statement 
        $sql2 = "UPDATE payment_invoice SET p_user_name='$full_name', p_user_address='$address_and_state', p_user_postalcode='$address_zip', p_user_country='$address_country', p_datetime='$dateConverted', p_payment_completed='$p_payment_completed', p_user_email='$payer_email', p_paypal_txn_id='$txn_id' WHERE p_unique_invoice_id='$item_number'"; 

        if ($conn->query($sql2) === TRUE) { 
         error_log(date('[Y-m-d H:i e] ') ."\r\n". "RECORDS UPDATED", 3, "./SuccessDB.log"); 
        } else {   
         error_log(date('[Y-m-d H:i e] ') ."\r\n". "FAILED UPDATE", 3, "./FailDB.log"); 
        } 
        $conn->close(); 
       } 
       catch(Exception $e){ 
        error_log(date('[Y-m-d H:i e] ') ."\r\n". "FAILED UPDATE".$e->getMessage(), 3, "./FailDBMSG.log"); 
       } 
      } 
      $conn->close(); 
     } 
    } 
} 
else if (strcmp ($res, "INVALID") == 0) { 
    // log for manual investigation 
    // Add business logic here which deals with invalid IPN messages 
    if(DEBUG == true) { 
     error_log(date('[Y-m-d H:i e] '). "Invalid IPN: $req" . PHP_EOL, 3, LOG_FILE); 
    } 
} 

?> 

базы данных Детали:

p_user_name = varchar(800)/string 
p_user_address = varchar(4000)/string (I know it's a lot of chars..) 
p_user_postalcode = varchar(50)/string 
p_user_country = varchar(500)/string 
p_datetime = datetime 
p_payment_completed = tinyint/boolean 1/0 
p_unique_invoice_id = varchar(25)/string 
p_user_email = varchar(100)/string 
p_paypal_txn_id = varchar(50)/string 
+1

Вы получаете свою строку ошибок в базе данных или ее успех? Вы пробовали эхом из SQL и ввели его непосредственно в базу данных, чтобы проверить, работает ли он тогда? Что сообщает '$ conn-> error()'? – andrewsi

+0

О, мальчик, даже не думал о $ conn-> error() .. как неуклюжий, сделает это как можно скорее и вернется к вам. не спали много, поэтому, вы знаете – IndieRok

+0

Хорошо .. это, скорее, как я должен его поместить .. смущаясь. Прежде всего, после всех этих попыток, я забыл переменную, в которой я пытался проанализировать дату/строку в datetime, с параметром - переменную, которая больше не существует. Довольно глупый, если вы спросите меня. Во-вторых, во всей моей спешке, чтобы получить ожидаемые результаты как можно быстрее, я забыл учитывать кеш браузера/сервера, который, вероятно, потребовался некоторое время для обработки кода, который я добавил в свой пост , который, в свою очередь, кажется, полностью функционирует на данный момент. – IndieRok

ответ

0

Не нужно ли объединять строку запроса вместе? Как так:

$sql2 = "UPDATE payment_invoice SET p_user_name='".$full_name."' WHERE p_unique_invoice_id='".$item_number."'"; 

Я думаю, что вы, что вы делаете пытается обновить, используя имя переменной в качестве ключа, а не фактическое значение.

+0

Если строка находится в двойных кавычках, тогда PHP будет интерполировать переменные для вас - вам не нужно конкатенировать строку. – andrewsi

0

EDIT: Отвечая на мой вопрос, чтобы закрыть эту тему.

Я забыл переменную, в которой я попытался проанализировать дату/строку в datetime, с параметром - переменную, которая больше не существует. Во-вторых, во всей моей спешке, чтобы получить ожидаемые результаты как можно быстрее, я забыл учитывать кеш браузера/сервера, который, вероятно, потребовался некоторое время для обработки кода, который я добавил в свой пост.

Итак, мой код работает, и мне нужно спать. Конец. Стыдно (немного).

Смежные вопросы