পিএইচপি + পিডিও + মাইএসকিউএল: আমি কীভাবে পিএইচপি তে পূর্ণসংখ্যা এবং সংখ্যার হিসাবে মাইএসকিউএল থেকে পূর্ণসংখ্যার এবং সংখ্যাসূচক কলামগুলি ফিরিয়ে দেব?


85

স্ট্যাক ওভারফ্লোতে আমি এই প্রশ্নটি কয়েকবার পুনরাবৃত্তি করে দেখেছি তবে কেউই যথেষ্ট পরিমাণে সমস্যাটি আবিষ্কার করতে পারে না (বা কমপক্ষে এমনভাবে যা আমার পক্ষে সহায়ক)

সমস্যাটি হ'ল কোনও ডিবি ক্যোয়ারীর পূর্ণসংখ্যা কলামগুলির জন্য পিএইচপিতে পূর্ণসংখ্যার ডেটা টাইপগুলি ফিরিয়ে দেওয়া উচিত। পরিবর্তে ক্যোয়ারি প্রতিটি কলামকে স্ট্রিংয়ের ধরণ হিসাবে ফেরত দেয়।

আমি নিশ্চিত করেছি যে "PDO :: ATTR_STRINGIFY_FETCHES" মিথ্যা থাকলে হয় তবে নিশ্চিত হয়ে যায় যে ফলাফলগুলি স্ট্রিংয়ে দেওয়া হচ্ছে না।

যে উত্তরগুলি আমি দেখেছি:

  • এটা করা যায় না
    • না, এটি ম্যাক ওএস এক্স ইনস্টলড পিএইচপি / মাইএসকিউএল নিয়ে কাজ করছে
  • আপনার কোডে আপনার সমস্ত মান castালাই টাইপ করুন
    • না, আমি এটা করবো না
  • এটি নিয়ে চিন্তা করবেন না, পিএইচপি আলগাভাবে টাইপ করা হয়
    • আমার ডেটা জেএসএন হিসাবে আউটপুট এবং অন্যান্য অনেক পরিষেবা ব্যবহার করে, কারও কারও কাছে সঠিক ফর্ম্যাটে ডেটা প্রয়োজন

আমার গবেষণা থেকে আমি বুঝতে পারি যে এটি একটি ড্রাইভার বাস্তবায়ন সমস্যা।

অনেকগুলি সূত্র দাবি করেছে যে মাইএসকিউএল নেটিভ ড্রাইভারগুলি সংখ্যার প্রকার ফিরে আসা সমর্থন করে না। এটি ম্যাক ওএস এক্সে কাজ করার পরে এটি সত্য বলে মনে হচ্ছে না Un যদি না তারা " লিনাক্সের মাইএসকিউএল নেটিভ ড্রাইভারটি বৈশিষ্ট্যটিকে সমর্থন করে না " বলে বোঝায় না।

এর থেকে বোঝা যায় যে ম্যাক ওএস এক্সে আমি যে ড্রাইভার / পরিবেশটি ইনস্টল করেছি সে সম্পর্কে বিশেষ কিছু রয়েছে a

পার্থক্য:

  • ওএস এক্সের পিএইচপি হোম ব্রিউয়ের মাধ্যমে সংকলন এবং ইনস্টল করা হয়েছিল
  • উবুন্টুতে পিএইচপি "অ্যাপ্লিকেশন পান পিএইচপি 5-ডেভ" এর মাধ্যমে ইনস্টল করা হয়েছিল
  • ওএস এক্সের পিএইচপি ওএস এক্সে চলমান একটি মাইএসকিউএল সার্ভারের সাথে সংযোগ স্থাপন করছে
    • সার্ভার সংস্করণ: 5.1.71-লগ উত্স বিতরণ
  • উবুন্টুতে পিএইচপি একটি র‌্যাকস্পেস ক্লাউড ডেটাবেস-এ সংযুক্ত হচ্ছে
    • সার্ভার সংস্করণ: 5.1.66-0 + স্কিজে 1 (দেবিয়ান)

উবুন্টু পরিবেশ

  • সংস্করণ: 10.04.1
  • পিএইচপি 5.4.21-1 + debphp.org uc লুসিড +1 (ক্লিপ) (নির্মিত: অক্টোবর 21 2013 08:14:37)
  • পিএইচপি -i

    pdo_mysql

    মাইএসকিউএল => সক্ষম ক্লায়েন্টের এপিআই সংস্করণ => 5.1.72 এর জন্য পিডিও ড্রাইভার

ম্যাক ওএস এক্স পরিবেশ

  • 10.7.5
  • পিএইচপি 5.4.16 (ক্লায়ার) (নির্মিত: আগস্ট 22 2013 09:05:58)
  • পিএইচপি -i

    pdo_mysql

    মাইএসকিউএল => সক্ষম ক্লায়েন্টের এপিআই সংস্করণ => মাইএসকিএলএনডি 5.0.10 - 20111026 - $ আইডি: e707c415db32080b3752b232487a435ee0372157 PD এর জন্য PDO ড্রাইভার

পিডিও পতাকা ব্যবহার করা হয়েছে

PDO::ATTR_CASE => PDO::CASE_NATURAL,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
PDO::ATTR_STRINGIFY_FETCHES => false,
PDO::ATTR_EMULATE_PREPARES => false,

যে কোনও সহায়তা এবং দক্ষতার প্রশংসা করা হবে :) উত্তরটি খুঁজে পেলে আমি অবশ্যই এখানে আবার পোস্ট করব।


4
এটি মাইএসকিএলএন্ডের দায়িত্ব। আমি বিশ্বাস করি
আপনার কমন সেন্স

আমার ঠিক একই প্রশ্ন, তবে এমএস এসকিউএল সার্ভারের জন্য। এর জন্য কি কোনও দৃq়ভাবে টাইপ করা লাইব্রেরিটি মাইএসকিএলডের অনুরূপ? সর্বশেষ ড্রাইভার আমি খুঁজে পাইনি সব স্ট্রিং ফিরে যান।
GSerg

উত্তর:


122

সমাধানটি হ'ল আপনি পিএইচপি জন্য mysqlnd ড্রাইভার ব্যবহার করছেন তা নিশ্চিত করা ।

আপনি কীভাবে জানবেন যে আপনি মাইএসকিএলএনডি ব্যবহার করছেন না?

দেখার সময় php -i, "মাইএসকিএলএনডি" এর উল্লেখ থাকবে নাpdo_mysqlঅধ্যায় ভালো কিছু করতে হবে:

pdo_mysql

PDO Driver for MySQL => enabled Client API version => 5.1.72

আপনি কীভাবে এটি ইনস্টল করবেন?

এল জন্য সবচেয়ে ইনস্টলেশন গাইড / এ / এম / পি সুপারিশ apt-get install php5-mysqlকিন্তু মাইএসকিউএল জন্য স্থানীয় চালক ভিন্ন প্যাকেজ দ্বারা ইনস্টল হয়: php5-mysqlnd। আমি দেখেছি যে এই সঙ্গে উপলব্ধ ছিল পিপিএ: ondrej / PHP5-oldstable

নতুন ড্রাইভারটিতে সরে যেতে (উবুন্টুতে):

  • পুরানো ড্রাইভারটি সরান:
    apt-get remove php5-mysql
  • নতুন ড্রাইভার ইনস্টল করুন:
    apt-get install php5-mysqlnd
  • অ্যাপাচি 2 পুনরায় চালু করুন:
    service apache2 restart

ড্রাইভার কীভাবে ব্যবহার হচ্ছে তা আমি কীভাবে চেক করব?

এখন বিভাগে php -iস্পষ্টভাবে "mysqlnd" উল্লেখ করবে pdo_mysql:

pdo_mysql

PDO Driver for MySQL => enabled
Client API version => mysqlnd 5.0.10 - 20111026 - $Id:      e707c415db32080b3752b232487a435ee0372157 $

PDO সেটিংস

নিশ্চিত করুন যে PDO::ATTR_EMULATE_PREPARESহয় false(আপনার ডিফল্ট চেক করুন বা এটি সেট):
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

নিশ্চিত করুন যে PDO::ATTR_STRINGIFY_FETCHESহয় false(আপনার ডিফল্ট চেক করুন বা এটি সেট):
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);

প্রত্যাবর্তিত মান

  • ফ্লোটিং পয়েন্টের ধরণগুলি (ফ্লাট, ডাবল) পিএইচপি ফ্লোট হিসাবে ফিরে আসে।
  • পূর্ণসংখ্যার প্রকারগুলি (INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT †) পিএইচপি পূর্ণসংখ্যা হিসাবে ফিরে আসে।
  • ফিক্সড-পয়েন্টের ধরণের (ডেসিমাল, NUMERIC) স্ট্রিং হিসাবে ফিরে আসে।

64 একটি 64 বিট স্বাক্ষরিত int (9223372036854775807) এর চেয়ে বড় মানের বিগিন্টগুলি স্ট্রিং হিসাবে ফিরে আসবে (বা 32 বিট সিস্টেমে 32 বিট)

    object(stdClass)[915]
      public 'integer_col' => int 1
      public 'double_col' => float 1.55
      public 'float_col' => float 1.5
      public 'decimal_col' => string '1.20' (length=4)
      public 'bigint_col' => string '18446744073709551615' (length=20)

4
মনে রাখবেন যে এই সংস্করণটি মাইএসকিএলএন্ড সক্ষম করা সত্ত্বেও, ডেসিমালগুলি এখনও স্ট্রিং হিসাবে প্রেরণ করা হবে ... (যদিও ফ্ল্যাটগুলি ভাসমান হিসাবে ফিরে আসবে!): / উত্স: আমি এটি পরীক্ষা করেছি।
পেরে

4
এছাড়াও লক্ষ করুন যে পিডিও :: এটিটিআর_আরস্ট্রিংআইফাই_ফিটস এর সাথে কোনও সম্পর্ক নেই - আমি চেষ্টা করেছি এবং ফলাফলের উপর তার কোনও প্রভাব নেই, এবং এই পোস্টে ব্যবহারকারী জোশ ডেভিস বলেছেন যে এটি মাইএসকিউএল এর সাথে সম্পর্কিত নয়।
পেরে

4
ধন্যবাদ, আমি আরও তদন্ত করেছি এবং ডেসিমাল টাইপ সম্পর্কে নোটগুলি দিয়ে আপডেট করেছি।
স্টিফেনফ্র্যাঙ্ক

4
@ আগে এটি সঠিক আচরণ is ডেসিমাল কোনও সংখ্যার প্রকার নয়। এটি সংখ্যার জন্য একটি স্ট্রিং বিন্যাস। সুতরাং আপনি আসতে পারেন: 0.30যেমন "0.30"পরিবর্তে 0.3। দশমিক
এটির

কেন এটি একটি জঘন্য সমঝোতা? আমাকে PDO::ATTR_EMULATE_PREPARESআরও একবার নামক প্যারামিটার ব্যবহার করতে হবে
গ্যাবি_64

5

এই স্বীকৃত উত্তরটি কাজ করে এবং এই প্রশ্নের জন্য গুগলে সর্বাধিক জনপ্রিয় উত্তর বলে মনে হচ্ছে। আমার সমস্যাটি হ'ল আমার একাধিক পরিবেশে একটি অ্যাপ্লিকেশন স্থাপন করা দরকার এবং সঠিক ড্রাইভারটি ইনস্টল করার ক্ষমতাটি আমার সবসময় নেই, এবং আমার ডেসিমালগুলিও স্ট্রিং নয় বরং সংখ্যাসূচক হওয়া দরকার। তাই আমি JSON এনকোডিংয়ের আগে কেস টাইপ করার একটি রুটিন তৈরি করেছি, যা সহজেই অনুসারে পরিবর্তন করা যায়। এটি কক্ষপথ থেকে nuking মত ধরণের।

প্রথমে সারণী থেকে কলামগুলি পেতে "থেকে কলামগুলি দেখান" ব্যবহার করুন। mysql ক্যোয়ারী "কলম্বনাম" এর মতো টেবিল থেকে কলম দেখান ": প্রশ্ন questions

$query = 'SHOW COLUMNS FROM ' . $table; //run with mysqli or PDO 

তারপরে পুনরাবৃত্তি সহজ করে তুলতে কলামের নাম অনুসারে একটি অ্যারেতে প্রকারগুলি পান। ধরে নেওয়া ফলাফল শো কলাম থেকে সেট ফলাফল একটি ভেরিয়েবল নাম vari কলামগুলি_ফ্রমে_ টেবিল হয়। http://php.net/manual/en/function.array-column.php

$column_types = array_column( $columns_from_table, 'Type', 'Field');

এরপরে আমরা টাইপটি থেকে প্যারেন্টিথিকালটি সরাতে চাই, যা ভার্চর (32) বা দশমিক (14,6) এর মতো হতে চলেছে

foreach( $column_types as $col=>$type )
{
    $len = strpos( $type, '(' );
    if( $len !== false )
    {
        $column_types[ $col ] = substr( $type, 0, $len );
    }
}

এখন আমাদের সূচক হিসাবে কলামের নাম এবং মান হিসাবে ফর্ম্যাট টাইপের সাথে একটি যুক্ত অ্যারে রয়েছে, উদাহরণস্বরূপ:

Array
(
    [id] => int
    [name] => varchar
    [balance] => decimal
    ...
)

এখন, আপনি যখন আপনার টেবিল থেকে আপনার নির্বাচনটি করেন আপনি ফলাফলগুলি নিয়ে পুনরাবৃত্তি করতে পারেন এবং মানটিকে উপযুক্ত প্রকারে ফেলে দিতে পারেন:

foreach( $results as $index=>$row )
{
    foreach( $row as $col=>$value )
    {
        switch( $column_types[$col] )
        {
            case 'decimal':
            case 'numeric':
            case 'float':
            case 'double':

                $row[ $col ] = (float)$value;
                break;

            case 'integer':
            case 'int':
            case 'bigint':
            case 'mediumint':
            case 'tinyint':
            case 'smallint':

                $row[ $col ] = (int)$value;
                break;
        }

    }
    $results[ $index ] = $row;
}

স্যুইচ স্টেটমেন্টটি সহজেই অনুসারে পরিবর্তন করা যেতে পারে এবং তারিখের কার্যাদি ইত্যাদি অন্তর্ভুক্ত থাকতে পারে উদাহরণস্বরূপ, আমার ক্ষেত্রে কোনও তৃতীয় পক্ষ দশমিক হিসাবে ডাটাবেসে মুদ্রার মানগুলিকে চাপ দিচ্ছে, তবে যখন আমি সেই ডেটা ধরি এবং এটি হিসাবে ফিরিয়ে দেওয়া দরকার জেএসন, আমার সংখ্যাগুলি হওয়া দরকার, স্ট্রিং নয়।

পিএইচপি 7, 7.2 এবং JQuery 2, 3 দিয়ে পরীক্ষিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.