foxpro — PHP фатальная ошибка: uncaught com_exception — INSERT INTO VFP9 База данных

Фатальная ошибка PHP: Uncaught com_exception: Источник: ADODB.Connection
Описание: Аргументы имеют неправильный тип, находятся за пределами допустимого диапазона или конфликтуют друг с другом. в C: \ inetpub \ wwwroot \ SonReceipt \ api \ create_test.php: 66
Трассировки стека:

  1. C: \ inetpub \ wwwroot \ SonReceipt \ api \ create_test.php (66): com-> prepare (‘ВСТАВИТЬ В СЫНА …’)
  2. C: \ inetpub \ wwwroot \ SonReceipt \ api \ create_test.php (35): create ()
  3. {главный}
    выбрасывается в C: \ inetpub \ wwwroot \ SonReceipt \ api \ create_test.php в строке 66

Это сообщение об ошибке из php-файла create_test.php:

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

Я просматривал похожие посты ‘Uncaught com_exception’ на этом форуме и на других сайтах, но они не совсем этого типа. Кто-нибудь сталкивался с чем-нибудь близким к этому?

ТИА.

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// required headers
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

// database connection
$conn = new COM("ADODB.Connection");
$conn->Open("Provider=VFPOLEDB.1;Data Source=C:\inetpub\wwwroot\sonreceipt\RECEIPT.DBC;Password='';Collating Sequence=MACHINE");

// get posted data
$jsonData = '{"refnum":"1111-2222-3333", "paydate":"01/06/2018", "custname":"O. A. BECKLEY VENTURES", "custemail":"beckleyventures@gmail.com", "demandno":"DEMAND NOTE 001", "demanddate":"01/06/2018", "amount":15550.00, "recpdesc":"SONCAP", "paybank":"ZENITH BANK PLC", "payref":"0123456789"}';
$data = json_decode($jsonData);

// set payment values received
$jrefnum = $data->refnum;
$jpaydate = $data->paydate;
$jcustname = $data->custname;
$jcustemail = $data->custemail;
$jdemandno = $data->demandno;
$jdemanddate = $data->demanddate;
$jamount = $data->amount;
$jrecpdesc = $data->recpdesc;
$jpaybank = $data->paybank;
$jpayref = $data->payref;

// create the payment
if (create()){
echo "Payment was created.";
}

// if unable to create the payment, tell the user
else {
echo "Unable to create payment.";
}

// create payment
function create(){

global $conn, $jrefnum, $jpaydate, $jcustname, $jcustemail, $jdemandno, $jdemanddate, $jamount, $jrecpdesc, $jpaybank, $jpayref;

// sanitize
$srefnum=$jrefnum;
$spaydate=$jpaydate;
$scustname=$jcustname;
$scustemail=$jcustemail;
$sdemandno=$jdemandno;
$sdemanddate=$jdemanddate;
$samount=$jamount;
$srecpdesc=$jrecpdesc;
$spaybank=$jpaybank;
$spayref=$jpayref;

// query to insert record
$query = "INSERT INTO SON2100 (refnum, paydate, custname, custemail, demandno, demanddate, amount, recpdesc, paybank, payref)
VALUES ($srefnum, $spaydate, $scustname, $scustemail, $sdemandno, $sdemanddate, $samount, $srecpdesc, $spaybank, $spayref)";

// prepare query
$stmt = $conn->prepare($query);

// execute query
if($stmt->execute()){
//$stmt->close();
return true;
}

return false;
}
?>

0

Решение

Ошибка была на самом деле вызвана:

  1. Не заключать переменные php в кавычки в предложении VALUES оператора INSERT для символьных полей.

  2. Обратное относится к числовым полям.

Обратите внимание, что значения, указанные в операторе INSERT, взяты из декодированной строки JSON. Смотрите рабочий код ниже.

?php

// required headers
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

// get database connection
$conn = new COM("ADODB.Connection");
$conn->Open("Provider=VFPOLEDB.1;Data Source=C:\inetpub\wwwroot\sonservices\RECEIPT.DBC;Password='';Collating Sequence=MACHINE");

class Payment{

// object properties
public $refnum;
public $paydate;
public $custname;
public $custemail;
public $demandno;
public $demanddate;
public $amount;
public $recpdesc;
public $paybank;
public $payref;

// create payment
function create(){

global $conn;

// convert to string values
$this->refnum=strval($this->refnum);
$this->paydate=strval($this->paydate);
$this->custname=strval($this->custname);
$this->custemail=strval($this->custemail);
$this->demandno=strval($this->demandno);
$this->demanddate=strval($this->demanddate);
$this->amount=strval($this->amount);
$this->recpdesc=strval($this->recpdesc);
$this->paybank=strval($this->paybank);
$this->payref=strval($this->payref);

// query to insert record
$query = "INSERT INTO SON2100
VALUES ('', '$this->refnum', '$this->paydate', '', '', '$this->custname', '$this->custemail', '$this->demandno', '$this->demanddate', $this->amount, '$this->recpdesc', '$this->paybank', '$this->payref', '')";

// execute query
if($conn->execute($query)){
return true;
}
return false;
}
}

// prepare payment object
$pymt = New Payment();

// get posted data
$data = json_decode(file_get_contents("php://input"));

// set payment property values and sanitize
$pymt->refnum = htmlspecialchars(strip_tags($data->refnum));
$pymt->paydate = htmlspecialchars(strip_tags($data->paydate));
$pymt->custname = htmlspecialchars(strip_tags($data->custname));
$pymt->custemail = htmlspecialchars(strip_tags($data->custemail));
$pymt->demandno = htmlspecialchars(strip_tags($data->demandno));
$pymt->demanddate = htmlspecialchars(strip_tags($data->demanddate));
$pymt->amount = htmlspecialchars(strip_tags($data->amount));
$pymt->recpdesc = htmlspecialchars(strip_tags($data->recpdesc));
$pymt->paybank = htmlspecialchars(strip_tags($data->paybank));
$pymt->payref = htmlspecialchars(strip_tags($data->payref));

// create the payment
if ($pymt->create()){
echo "Payment was created.";
}

// if unable to create the payment, tell the user
else{
echo "Unable to create payment.";
}

?>
0

Другие решения

Других решений пока нет …