为什么PDO_MySQL不返回整数?

时间:2013-04-21 08:49:04

标签: php mysql pdo

我正在将我的PHP代码从mysql(在5.5中弃用)迁移到PDO_MySQL。但是,mysql_fetch_row返回整数,而PDOStatement::fetch返回数字的字符串。我怎样才能让PDO像前者一样?

mysql_fetch_row的结果:

array(1) {
  ["id"]=>
  int(1)
}

PDOStatement::fetch的结果:

array(1) {
  ["id"]=>
  string(1) "1"
}

3 个答案:

答案 0 :(得分:13)

如果您确实需要使用松散类型的PHP

,请将PDO::ATTR_EMULATE_PREPARES设置为false

如果mysql_fetch_row为SUM返回int(我从不关心检查) - 那么它会像if (ctype_digit($val)) $row[$key] = (int)$val;那样做一些魔术 - 所以你可以在你的DBAL中做

据我了解预处理语句的工作方式,它使用相同的数据包结构来发送和检索数据,此数据包包含数据类型。

看起来服务器可以返回2种格式的数据 - native和mysqlnd,取决于请求类型。后者可以由客户端库解释以转换结果值。

答案 1 :(得分:11)

对于记录,PDO提供了一个可以改变它的功能,PDO::ATTR_STRINGIFY_FETCHES

  

获取时将数值转换为字符串。需要bool

设置背后的基本原理是数据库引擎可以处理非常大的数字(例如,Oracle允许38位数字),而PHP则不能。将这些数字作为字符串检索是一种保持安全并防止数据丢失的方法。

不幸的是,the MySQL driver does not support it

<?php

$pdo = new PDO('mysql:host=localhost;dbname=test', 'test', 'test');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
$sql = 'SELECT 1 AS integer_number, 3.14 AS floating_point';
$res = $pdo->query($sql);
while($row = $res->fetch(PDO::FETCH_ASSOC)){
    var_dump($row);
}

array(2) {
  ["integer_number"]=>
  string(1) "1"
  ["floating_point"]=>
  string(4) "3.14"
}

答案 2 :(得分:1)

您可以将json_encode和json_decode与JSON_NUMERIC_CHECK选项一起使用,以检索具有数字类型的数组:

   add_action( 'woocommerce_thankyou', 'my_custom_tracking' );
function my_custom_tracking( $order_id ) {
//подключение к серверу CRM
define('CRM_HOST', 'your_domain.bitrix24.ru'); // Ваш домен CRM системы
define('CRM_PORT', '443'); // Порт сервера CRM. Установлен по умолчанию
define('CRM_PATH', '/crm/configs/import/lead.php'); // Путь к компоненту lead.rest
//авторизация в CRM
define('CRM_LOGIN', 'your_email@email.com'); // Логин пользователя Вашей CRM по управлению лидами
define('CRM_PASSWORD', 'your_password'); // Пароль пользователя Вашей CRM по управлению лидами
// получение информации по заказу
$order = wc_get_order( $order_id );
$order_data = $order->get_data();
// базjвая информация по заказу
$order_id = $order_data['id'];
$order_currency = $order_data['currency'];
$order_payment_method_title = $order_data['payment_method_title'];
$order_shipping_totale = $order_data['shipping_total'];
$order_total = $order_data['total'];
$order_base_info = "<hr><strong>Общая информация по заказу</strong><br>
ID заказа: $order_id<br>
Валюта заказа: $order_currency<br>
Метода оплаты: $order_payment_method_title<br>
Стоимость доставки: $order_shipping_totale<br>
Итого с доставкой: $order_total<br>";
// информация по клиенту
$order_customer_id = $order_data['customer_id'];
$order_customer_ip_address = $order_data['customer_ip_address'];
$order_billing_first_name = $order_data['billing']['first_name'];
$order_billing_last_name = $order_data['billing']['last_name'];
$order_billing_email = $order_data['billing']['email'];
$order_billing_phone = $order_data['billing']['phone'];
$order_client_info = "<hr><strong>Информация по клиенту</strong><br>
ID клиента = $order_customer_id<br>
IP адрес клиента: $order_customer_ip_address<br>
Имя клиента: $order_billing_first_name<br>
Фамилия клиента: $order_billing_last_name<br>
Email клиента: $order_billing_email<br>
Телефон клиента: $order_billing_phone<br>";
// информация по доставке
$order_shipping_address_1 = $order_data['shipping']['address_1'];
$order_shipping_address_2 = $order_data['shipping']['address_2'];
$order_shipping_city = $order_data['shipping']['city'];
$order_shipping_state = $order_data['shipping']['state'];
$order_shipping_postcode = $order_data['shipping']['postcode'];
$order_shipping_country = $order_data['shipping']['country'];
$order_shipping_info = "<hr><strong>Информация по доставке</strong><br>
Страна доставки: $order_shipping_state<br>
Город доставки: $order_shipping_city<br>
Индекс: $order_shipping_postcode<br>
Адрес доставки 1: $order_shipping_address_1<br>
Адрес доставки 2: $order_shipping_address_2<br>";
// получение информации по товару
$order->get_total();
$line_items = $order->get_items();
foreach ( $line_items as $item ) {
$product = $order->get_product_from_item( $item );
$sku = $product->get_sku(); // артикул товара
$id = $product->get_id(); // id товара
$name = $product->get_name(); // название товара
$description = $product->get_description(); // описание товара
$stock_quantity = $product->get_stock_quantity(); // кол-во товара на складе
$qty = $item['qty']; // количество товара, которое заказали
$total = $order->get_line_total( $item, true, true ); // стоимость всех товаров, которые заказали, но без учета доставки
$product_info[] = "<hr><strong>Информация о товаре</strong><br>
Название товара: $name<br>
ID товара: $id<br>
Артикул: $sku<br>
Описание: $description<br>
Заказали (шт.): $qty<br>
Наличие (шт.): $stock_quantity<br>
Сумма заказа (без учета доставки): $total;";
}
$product_base_infо = implode('<br>', $product_info);
$subject = "Заказ с сайта № $order_id";
//сопостановление полей Bitrix24 с полученными данными из Contact Form 7
$postData = array(
'TITLE' => $subject,
'COMMENTS' => $order_base_info.' '.$order_client_info.' '.$order_shipping_info.' '.$product_base_infо
);
//передача данных из Contact Form 7 в Bitrix24
if (defined('CRM_AUTH')) {
$postData['AUTH'] = CRM_AUTH;
} else {
$postData['LOGIN'] = CRM_LOGIN;
$postData['PASSWORD'] = CRM_PASSWORD;
}
$fp = fsockopen("ssl://".CRM_HOST, CRM_PORT, $errno, $errstr, 30);
if ($fp) {
$strPostData = '';
foreach ($postData as $key => $value)
$strPostData .= ($strPostData == '' ? '' : '&').$key.'='.urlencode($value);
$str = "POST ".CRM_PATH." HTTP/1.0\r\n";
$str .= "Host: ".CRM_HOST."\r\n";
$str .= "Content-Type: application/x-www-form-urlencoded\r\n";
$str .= "Content-Length: ".strlen($strPostData)."\r\n";
$str .= "Connection: close\r\n\r\n";
$str .= $strPostData;
fwrite($fp, $str);
$result = '';
while (!feof($fp))
{
$result .= fgets($fp, 128);
}
fclose($fp);
$response = explode("\r\n\r\n", $result);
$output = '<pre>'.print_r($response[1], 1).'</pre>';
} else {
echo 'Connection Failed! '.$errstr.' ('.$errno.')';
}
}