PHP / MySQL / PDO - результаты ложные, но нет сообщения об ошибке БД? - PullRequest
3 голосов
/ 17 июня 2011

У меня есть кусок кода, который работает странно.Иногда это работает, иногда нет.Сервер имеет абсолютно древнюю копию PHP (5.1.6, пять лет назад, но с исправлениями безопасности, которые были вручную перенесены Red Hat).

Вот код, включая строки отладки, которые у меня есть в настоящее время вэто:

<?php
// Includes json_print, which does a json_encode, an 
// appropriate content-type header, prints it, and exits the script.
include_once('json-functions.php');

$uid = $_POST['uid'];

$salted = false;

if(isset($_POST['salted'])){ $salted = true; }

// No uid given.
if(is_null($uid) || $uid === ''){
        $details = array(
            'error' => 1,
            'errorMessage' => 'No unique ID entered.  Please try again.',
        );
        json_print($details);
}

// Validate uid.  Must be 64 digit hexadecimal value.
$pattern = '/^[a-f0-9]{64}$/i';
if(preg_match($pattern, $uid) === 0){
        $details = array(
            'error' => 2,
            'errorMessage' => 'Invalid unique ID.',
        );
        json_print($details);
}


include_once('../db.php');

header('Content-Type: text/plain');

// Is this salted already?
var_dump($salted);

// What's the UID?
var_dump($uid);

if(!$salted){ $uid = hash('sha256', $salt.$uid); }

// Was the UID salted?  (shouldn't be double-salted)
var_dump($uid);

// The query
$SQL = 'SELECT ';

    $SQL .= 'p.patronID AS patronID, ';
    $SQL .= 'uniqueID, ';
    $SQL .= 'status, ';
    $SQL .= 'active, ';
    $SQL .= 'd.name AS department, ';
    $SQL .= 'docdelivery, ';
    $SQL .= 'terms, ';
    $SQL .= 'copyright, ';
    $SQL .= 'lastLogin, ';
    $SQL .= 'updated, ';
    $SQL .= 'TIMESTAMPDIFF(MINUTE, lastLogin, NOW()) AS recency, ';
    $SQL .= 'DATEDIFF(NOW(), updated) AS stale, ';

    $SQL .= 'AES_DECRYPT(first, ?) AS first, ';
    $SQL .= 'AES_DECRYPT(last, ?) AS last, ';
    $SQL .= 'AES_DECRYPT(barcode, ?) AS barcode, ';
    $SQL .= 'INET_NTOA(AES_DECRYPT(ip, ?)) AS ip, ';
    $SQL .= 'AES_DECRYPT(email, ?) AS email, ';
    $SQL .= 'AES_DECRYPT(phone, ?) AS phone, ';
    $SQL .= 'AES_DECRYPT(address1, ?) AS address1, ';
    $SQL .= 'AES_DECRYPT(address2, ?) AS address2, ';
    $SQL .= 'AES_DECRYPT(city, ?) AS city, ';
    $SQL .= 'AES_DECRYPT(state, ?) AS state, ';
    $SQL .= 'AES_DECRYPT(zip, ?) AS zip ';

$SQL .= 'FROM patrons p, departments d ';
$SQL .= 'WHERE department = d.deptID ';
$SQL .= 'AND uniqueID = ?';

$query = $DB->prepare($SQL);

$p = array(
    $key,
    $key,
    $key,
    $key,
    $key,
    $key,
    $key,
    $key,
    $key,
    $key,
    $key,
    $uid,
);

$query->execute($p);

$result = $query->fetch();

// dump the results
var_dump($result);
print "\n\n";

// And any error info
var_dump($DB->errorInfo());
exit;

Вот пример выходных данных, когда он работает правильно:

// Salted is true
bool(true)

// UID is:
string(64) "52223d99e1db275716028cf6fd4f58895b1df7eb8e061cefab346b8ce3cf4ff4"

// It was not double-salted:
string(64) "52223d99e1db275716028cf6fd4f58895b1df7eb8e061cefab346b8ce3cf4ff4"

// Results were:
array(46) {
  ["patronID"]=>
  string(1) "126"
  [0]=>
  string(1) "126"
  ["uniqueID"]=>
  string(64) "52223d99e1db275716028cf6fd4f58895b1df7eb8e061cefab346b8ce3cf4ff4"
  [1]=>
  string(64) "52223d99e1db275716028cf6fd4f58895b1df7eb8e061cefab346b8ce3cf4ff4"
  ["status"]=>
  string(1) "4"
  [2]=>
  string(1) "4"
  ["active"]=>
  string(1) "1"
  [3]=>
  string(1) "1"

  *** snip! ***

  [21]=>
  string(2) "TX"
  ["zip"]=>
  string(5) "78623"
  [22]=>
  string(5) "78623"
}

// Errors reported?
array(1) {
  [0]=>
  string(5) "00000"
}

А вот пример выходных данных, когда он выходит из строя:

 // Salted is true
bool(true)

// UID is:
string(64) "1d6fa3b897b07301a836f5441d23f60e7cb4b52a00ee6d20648fe51b01c769bf"

// It was not double salted
string(64) "1d6fa3b897b07301a836f5441d23f60e7cb4b52a00ee6d20648fe51b01c769bf"

// Results were:
bool(false)

// Error code was:
array(1) {
  [0]=>
  string(5) "00000"
}

Я могу 'Не могу понять, почему это работает для НЕКОТОРЫХ UID, но не для других.Кроме того, во втором примере набор результатов возвращается в состояние FALSE, но база данных сообщает об ошибке 00000, что означает «без ошибок».Я уже проверил, правильно ли готовится запрос, и это в обоих случаях.

Чего мне здесь не хватает?

Ответы [ 3 ]

2 голосов
/ 18 июня 2011

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

2 голосов
/ 18 июня 2011

* Facepalm *

Хорошо, я понял это. Запрос не выполнен из-за этого:

WHERE department = d.deptID

Учетные записи, которые не работали, возвращали ноль результатов, потому что у них был идентификатор отдела без соответствующего отдела в таблице отделов.

Извините, у меня хорошая порция вороны в духовке. В любом случае, спасибо!

1 голос
/ 18 июня 2011

Проверьте $ query-> errorInfo () после выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...