2011-03-16 22 views
25

मैं कुछ PHP/MySQL कोड के साथ संघर्ष कर रहा हूं। मैं 1 टेबल से पढ़ रहा हूं, फिर कुछ फ़ील्ड बदल रहा हूं और फिर दूसरी टेबल पर लिख रहा हूं, अगर डालने पर कुछ भी नहीं होता है और सरणी मानों में से एक शून्य होता है तो मैं डेटाबेस में शून्य डालना चाहता हूं (फ़ील्ड के लिए शून्य मानों की अनुमति है)। यह इस तरह एक सा दिखता है:PHP/MySQL शून्य मानों को सम्मिलित करें

$results = mysql_query("select * from mytable"); 
while ($row = mysql_fetch_assoc($results) { 
    mysql_query("insert into table2 (f1, f2) values ('{$row['string_field']}', {$row['null_field']}); 
} 

हर पंक्ति एक अशक्त मूल्य नहीं है और अपनी क्वेरी में और अधिक क्षेत्रों और 2 कॉलम जो या नल

उत्तर

50

यह एक उदाहरण है जहाँ तैयार बयानों उपयोग कर रहा है वास्तव में आपको कुछ परेशानी बचाता है।

MySQL में, आदेश में एक शून्य मान सम्मिलित करने के लिए, आप इसे INSERT समय में निर्दिष्ट या क्षेत्र को छोड़ जो अतिरिक्त शाखाओं की आवश्यकता चाहिए:

INSERT INTO table2 (f1, f2) 
    VALUES ('String Value', NULL); 

हालांकि, अगर आपको लगता है कि में एक मूल्य सम्मिलित करना चाहते हैं फ़ील्ड, अब आपको सिंगल कोट्स जोड़ने के लिए अपने कोड को ब्रांच करना होगा:

INSERT INTO table2 (f1, f2) 
    VALUES ('String Value', 'String Value'); 

तैयार कथन स्वचालित रूप से आपके लिए ऐसा करते हैं। वे string(0) "" और null बीच का अंतर जानना और आपकी जिज्ञासा उचित रूप से लिखें:

$stmt = $mysqli->prepare("INSERT INTO table2 (f1, f2) VALUES (?, ?)"); 
$stmt->bind_param('ss', $field1, $field2); 

$field1 = "String Value"; 
$field2 = null; 

$stmt->execute(); 

यह आप के लिए अपने खेतों पलायन, सुनिश्चित करें कि आप भूल नहीं है कि एक पैरामीटर बाध्य करने के लिए बनाता है। mysql एक्सटेंशन के साथ रहने का कोई कारण नहीं है। mysqli का उपयोग करें और इसके बजाय prepared statements है। आप खुद को दर्द की दुनिया बचाएंगे।

+3

शानदार, धन्यवाद, अब मैं एक mysqli रूपांतरित कर रहा हूं! – MattP

+5

@MattP: ध्यान दें कि पीडीओ का एक ही व्यवहार है। एक पर बसने से पहले प्रत्येक के लिए एपीआई की तुलना करें (पीडीओ आसान है उपयोग और बड़े पैमाने पर डीबी अज्ञेयवादी, mysqli MySQL एपीआई के लिए अधिक सीधी पहुंच प्रदान करता है)। – outis

+0

एक और दृष्टिकोण - https://stackoverflow.com/a/20900661/4050261 –

5

मैं आप के आसपास उद्धरण की जरूरत नहीं लगता है कि हो सकता है देखते हैं अपने insert into table2 (f1, f2) values ('val1',) जो एक सिंटैक्स त्रुटि है: {$row['null_field']}, तो '{$row['null_field']}'

आप उद्धरण की जरूरत नहीं है, तो आप कभी कभी ऊपर एक डालने बयान है कि इस तरह लग रहा है के साथ समाप्त होगा।

हैं कि संख्यात्मक फ़ील्ड है, तो आप इसे ऊपर कुछ परीक्षण करना होगा, और अगर वहाँ null_field में कोई मूल्य नहीं है, स्पष्ट रूप से इसे शून्य पर सेट ..

+0

धन्यवाद, मैं कुछ अतिरिक्त परीक्षण जोड़ने के लिए और स्पष्ट रूप से nulls सेट करना होगा, यह अनुप्रयोग है कि खेतों रिक्त स्ट्रिंग के बजाय अशक्त हैं में और अधिक तार्किक है। – MattP

+0

दुर्भाग्यवश, फ़ील्ड को उद्धृत करना गलत होगा, यदि मान डाला जाना शून्य है। एक कथन में पूरा कथन नहीं कर सकता; 'mysql_query ("table2 (f1, f2) मानों (' {$ row ['string_field']}," में डालें। (is_null ($ row ['null_field']), "NULL", "' {$ row ['null_field']} '')। ")" 'एक सहायक फ़ंक्शन बनाने के द्वारा जिसे पढ़ने के लिए आसान बनाया जा सकता है' फ़ंक्शन उद्धृत ValueOrNull ($ मान) {वापसी (is_null ($ value), "NULL", " '{$ value}' ");}' – ToolmakerSteve

4

क्षेत्रों के लिए जहां NULL स्वीकार्य है, आप उत्पादन string, integer, या NULL शाब्दिक को var_export($var, true) इस्तेमाल कर सकते हैं। ध्यान दें कि आप उद्धरण के साथ आउटपुट को घेर नहीं पाएंगे क्योंकि वे स्वचालित रूप से जोड़े जाएंगे या छोड़े जाएंगे।

उदाहरण के लिए:

mysql_query("insert into table2 (f1, f2) values ('{$row['string_field']}', ".var_export($row['null_field'], true).")"); 
संबंधित मुद्दे