Компания, в которой я работаю, использует PHP и SQL Server для нашего основного, ориентированного на клиента веб-сайта.Для связи между сайтом и базой данных мы используем встроенные в PHP функции ODBC.Используя это, всякий раз, когда я использую переменные, отправленные из Интернета, я всегда использую параметры привязки, и они всегда работали для меня.Проблема, с которой я столкнулся, заключалась в том, что при хранении данных кредитной карты с использованием параметров привязки в базу данных передавалась только первая цифра.Поскольку числа были зашифрованы, проблема не была сразу замечена.Я понимаю, где возникла проблема, но не могу понять, почему.
Справочная информация: На прошлой неделе я настроил веб-страницу для одного из наших крупнейших событий года и использовал немного другой вызов в базе данных, чем я.обычно делают при хранении номера кредитной карты.Я проверил это, увидел, что информация сохраняется, и отправил ее на производство.Вернемся к пятнице, когда я пошел, чтобы проверить некоторые цифры, ради страницы обработки платежа этого события, и я узнал, что у нас не было ни одного из чисел в файле.У нас была только первая цифра.На странице регистрации я проследил за вводом до вызова базы данных, и даже после вызова, и обнаружил, что он весь процесс.
Вот соответствующие функции, которые я использовал
<?php
// ...
$registerID = placeRegistration($eventInfo["ID"], $attendeeFirst, $attendeeLast, $attendeePhone, $attendeeEmail, $attendeeClub);
if($registerID === NULL){
$errStr .= "Unable to place registration. Please try again later.<br>";
}else{
if(placePayment($registerID, _POST("bigInt"), _POST("bigIntMon"), _POST("bigIntYear"), _POST("totalCost")) === false){
$errStr .= "Unable to place payment for this registration. Please try again.<br>";
}
// ...
?>
<!-- ... -->
<?php
/**
* Places a registration into EventsRegister.
* Returns the ID of the added entry if successful, else returns false.
*/
function placeRegistration($eventID, $firstName, $lastName, $phone, $email, $clubCard){
$placeRegister = odbc_prepare($GLOBALS["dbh_WEB"], "
INSERT INTO EventRegisters(EventID, FirstName, LastName, Phone, Email, ClubCard)
OUTPUT INSERTED.ID
VALUES (?, ?, ?, ?, ?, ?)
");
if(!odbc_execute($placeRegister, array($eventID, $firstName, $lastName, $phone, $email, $clubCard))){
$registerID = false;
print_error(9, array($eventID, $firstName, $lastName, $phone, $email, $clubCard), __FILE__, __LINE__);
}else{
$temp = odbc_fetch_array($placeRegister);
$registerID = $temp["ID"];
}
return $registerID;
}
/**
* Adds the payment for the corresponding registration ID.
* Returns true if successful, else false
*/
function placePayment($registerID, $pink, $expMo, $expYr, $total){
$placePayment = odbc_prepare($GLOBALS["dbh_WEB"], "
INSERT INTO EventPayments(RegisterID, Pink, ExpMo, ExpYr, Total)
VALUES (?, ENCRYPTBYPASSPHRASE('".$GLOBALS["pinkySwear"]."', ?), ?, ?, ?)
");
if(!odbc_execute($placePayment, array($registerID, $pink, $expMo, $expYr, $total))){
return false;
}else{
return true;
}
}
Упомянутые здесь $GLOBALS
: $pinkySwear
пароль шифрования, $dbh_WEB
дескриптор базы данных
$dbh_WEB = odbc_connect("Driver={SQl Server Native Client 11.0};Server=$server;Database=website", $server_user, $server_password)
or die('Something went wrong while connecting to MSSQL');
Заявление о проблеме является следующим:
$placePayment = odbc_prepare($GLOBALS["dbh_WEB"], "
INSERT INTO EventPayments(RegisterID, Pink, ExpMo, ExpYr, Total)
VALUES (?, ENCRYPTBYPASSPHRASE('".$GLOBALS["pinkySwear"]."', ?), ?, ?, ?)
");
if(!odbc_execute($placePayment, array($registerID, $pink, $expMo, $expYr, $total))){
return false;
}else{
return true;
}
Это утверждение по какой-то причине вводится только в первую цифру $pink
.Если бы я использовал следующее утверждение, которое у меня было под впечатлением, функционирует так же, оно прекрасно работает.
$placePayment = odbc_prepare($GLOBALS["dbh_WEB"], "
INSERT INTO EventPayments(RegisterID, Pink, ExpMo, ExpYr, Total)
VALUES (?, ENCRYPTBYPASSPHRASE('".$GLOBALS["pinkySwear"]."', '$pink'), ?, ?, ?)
");
if(!odbc_execute($placePayment, array($registerID, $expMo, $expYr, $total))){
return false;
}else{
return true;
}
В чем причина того, что параметр привязки будет усекать 12-От 19 цифр до первой цифры?
В наших системах используется PHP 7.1.19, драйвер ODBC «Собственный клиент SQL Server 11.0», SQL Server 12.0.5579.0