2010-03-12 7 views
18

मैंने mysql_fetch_row() और mysql_result() का उपयोग करके MySQL क्वेरी परिणामों को लाने का प्रयास किया है और संख्यात्मक मान स्ट्रिंग के रूप में वापस किए जा रहे हैं।MySQL क्वेरी परिणाम अपने मूल डेटा प्रकार के रूप में प्राप्त करें?

क्या डेटा को डेटा में संग्रहीत डेटाटाइप के रूप में लाने का कोई तरीका है?

एप्लिकेशन कई अलग-अलग प्रश्न पूछताछ करेगा, इसलिए मैं मूल्य 1 से 1 आधार पर इच्छित डेटाटाइप के रूप में मूल्यों को डालने में असमर्थ हूं।

उत्तर

14

मैं अपनी मूल डेटाटाइप्स में डेटा (कुछ भी यानी बाकी है कि तार) पीएचपी 5.2 में किया जा सकता ...

पीएचपी 5.3 में हो रही नहीं लगता कि, अगर मैं सही ढंग से याद है यह संभव हो जाता है, जब आप नए (PHP> = 5.3 के रूप में नया) mysqlnd (MySQL मूल चालक) ड्राइवर का उपयोग कर रहे हैं। PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

यह इस (उद्धरण) का कहना है::

पीडीओ के लिए mysqlnd का उपयोग कर के लाभ

mysqlnd देशी रिटर्न

अधिक अपने बुकमार्क के माध्यम से खुदाई करने के बाद मैं mysqlnd के बारे में इस लेख पाया डेटा प्रकार जब सर्वर-साइड तैयार वक्तव्य का उपयोग करते हुए, उदाहरण के लिए एक आईएनटी कॉलम को एक पूर्णांक चर के रूप में वापस कर दिया जाता है ई स्ट्रिंग के रूप में नहीं। इसका मतलब आंतरिक डेटा कम से कम रूपांतरण है।

लेकिन इस पीएचपी 5.3 केवल (बशर्ते पीएचपी 5.3 के अपने संस्करण mysqlnd (और नहीं वर्ष libmysql) साथ संकलित किया गया है), और केवल

:-(तैयार बयान के लिए मामला प्रतीत हो रहा है

कौन सा नहीं काफी मदद करता है, अपनी स्थिति में, मुझे लगता है ...


और यहाँ एक और एक है जो न केवल तैयार बयानों के लिए इस बारे में बात करती mysqlnd की नई सुविधाओं के बारे में अभी भी है,:। PHP: New network traffic, CPU and memory savings with mysqlnd

012,

यह सुनिश्चित नहीं है कि इसे आधिकारिक mysqlnd ड्राइवर में विलय कर दिया गया है, हालांकि - सबसे अच्छा तरीका प्रयास करना होगा; लेकिन यह अभी भी हो जाएगा पीएचपी> = 5.3 केवल, वैसे भी ...


एक अन्य समाधान पीएचपी साइड पर, के लिए, एक मानचित्रण प्रणाली (एक ORM) की तरह किसी तरह का होगा को पीएचपी डेटाटाइप्स को डीबी से आने वाले परिणामों को परिवर्तित ...

और हाँ, यह बुरा है आप === और !==, जो प्रकार-संवेदी होते हैं जैसे ऑपरेटरों उपयोग करना चाहते हैं ...

+0

धन्यवाद पास्कल मार्टिन! मैं कई घंटों तक गुगल रहा हूं और मुझे कुछ भी नहीं मिला है जिसका मैं उपयोग कर सकता हूं। मैं PHP के लिए अपेक्षाकृत नया हूं, लेकिन ऐसा लगता है कि अगर मुझे मूल समर्थन चाहिए तो मुझे पीडीओ के साथ जाना होगा। दुर्भाग्य से मेरा होस्ट 5.2.something चल रहा है ... यह भी मुश्किल है कि मैं एक XML रिपोर्ट फ़ाइल इनपुट बनाने की कोशिश कर रहा हूं जिसमें अलग-अलग क्वेरी जानकारी हो। PHP स्क्रिप्ट अनुरोधित xml फ़ाइल को पढ़ता है और क्वेरी को डेटाबेस में भेजता है, इसलिए मैं वास्तव में कभी नहीं जानूंगा कि कौन से डेटा पूछे जा रहे हैं और इसे कैसे वापस किया जाना चाहिए। रचनात्मक होने का समय मुझे लगता है :) –

+1

पीडीओ या पीडीओ को कुछ भी नहीं बदला जाना चाहिए, इस मामले में: क्या मायने रखता है ड्राइवर (* यानी libmysql बनाम mysqlnd) * - और मुझे यह भी यकीन नहीं है कि PHP 5.3.2 में mysqlnd मानक प्रश्नों के लिए देशी प्रकार लौटाता है ;;; आपके मामले में, वैसे भी, PHP 5.2 के साथ, आपके पास एकमात्र समाधान होगा जो कुछ मैपिंग परत होगा, जो आवश्यक होने पर रूपांतरण टाइप करता है ... –

+0

ध्यान दें कि आपको [तैयार कथन अनुकरण बंद करना होगा] (http://stackoverflow.com/a/15592818/441684) यदि पीडीओ का उपयोग करना है। –

3

मैं इस क्रियान्वित किया है मैनुअल तरीका। यह वास्तव में बहुत खराब नहीं है, बस कुछ लाइनें।

सुझाए गए अनुसार, अपनी क्वेरी से उत्पन्न संसाधन पर mysqli_fetch_fields() को कॉल करें।

फिर PHP फ़ील्ड प्रकार संख्याओं के मैपिंग से MySQL डेटा प्रकारों में मैपिंग से (http://www.php.net/manual/en/mysqli-result.fetch-field-direct.php मेहनती काम देखें) आप अपने मानों को PHP में उचित प्रकार में MySQLi द्वारा स्ट्रिंग के रूप में लौटाए गए डेटाबेस प्रकारों की विस्तृत श्रृंखला से परिवर्तित कर सकते हैं।

मुझे कितनी धीमी गति है, मुझे यकीन नहीं है।

+0

यह वही है जो मुझे चाहिए था। धन्यवाद! – jbrahy

1

मैं (पीडीओ के लिए) इस circuvent करने के लिए एक समारोह लिखा है:

/** 
* Converts columns from strings to types according to 
* PDOStatement::columnMeta 
* 
* @param PDOStatement $st 
* @param array $assoc returned by PDOStatement::fetch with PDO::FETCH_ASSOC 
* @return copy of $assoc with matching type fields 
*/ 
function convertTypes(PDOStatement $statement, $assoc) 
{ 
    for ($i = 0; $columnMeta = $statement->getColumnMeta($i); $i++) 
    { 
     $type = $columnMeta['native_type']; 

     switch($type) 
     { 
      case 'DECIMAL': 
      case 'TINY': 
      case 'SHORT': 
      case 'LONG': 
      case 'LONGLONG': 
      case 'INT24': 
       $assoc[$columnMeta['name']] = (int) $assoc[$columnMeta['name']]; 
       break; 
      case 'DATETIME': 
      case 'DATE': 
      case 'TIMESTAMP': 
       $assoc[$columnMeta['name']] = strtotime($assoc[$columnMeta['name']]); 
       break; 
      // default: keep as string 
     } 
    } 

    return $assoc; 
} 
बेशक

प्रकार सूची पूरी नहीं कर रहे हैं और रूपांतरण oversimplified है, लेकिन शुरुआत के लिए उपयोगी हो सकता है।

3

यह कोशिश करता है, तो mysqli का उपयोग कर पीडीओ

$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); 
+0

यह मेरे लिए अपना काम था। धन्यवाद! – Victor

-1

के बजाय पास्कल मार्टिन जवाब देने के लिए इसके अलावा, यदि आप MySQLi भी काम करना चाहिए का उपयोग करें। इस प्रयास करें:

<?php 
$mysqli = new mysqli("example.com", "user", "password", "database"); 
if ($mysqli->connect_errno) { 
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
} 

if (!$mysqli->query("DROP TABLE IF EXISTS test") || 
    !$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))") || 
    !$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')")) { 
    echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error; 
} 

$stmt = $mysqli->prepare("SELECT id, label FROM test WHERE id = 1"); 
$stmt->execute(); 
$res = $stmt->get_result(); 
$row = $res->fetch_assoc(); 

printf("id = %s (%s)\n", $row['id'], gettype($row['id'])); 
printf("label = %s (%s)\n", $row['label'], gettype($row['label'])); 
?> 

ऊपर के उदाहरण होगा उत्पादन:

id = 1 (integer) 
label = a (string) 

आप यहाँ अधिक जानकारी प्राप्त कर सकते हैं: https://dev.mysql.com/doc/apis-php/en/apis-php-mysqli.quickstart.prepared-statements.html

आशा इस मदद करता है

संबंधित मुद्दे