2012-09-19 10 views
7

नहीं बना रहा है, तो मैं एक नाम, संख्या और कंपनी को डीबी में डाल रहा हूं।मौजूद होने पर एक पंक्ति अपडेट करें, यदि कोई नया MySQL

मेरे तालिका बस है:

id(primary key) 
name 
slideView 
company 

मैं अगर एक नाम से पारित कर दिया यह जानकारी अपडेट करने यह मौजूद है, यदि इस डेटा के साथ एक नई पंक्ति नहीं बना की जरूरत है। मैंने REPLACE INTO पर देखा है लेकिन मुझे नहीं लगता कि यह मेरे लिए काम करेगा ... क्योंकि मैं आईडी को बिल्कुल स्पर्श नहीं करता हूं।

मेरे कोड है:

insertData($name,$count,$company); 

function insertData($name, $count, $company) { 

    #Try/Catch statement to connect to DB, and insert data 
    try { 
     #DB username/password 
     $usernameDB = '****'; 
     $passwordDB = '****'; 

     #Create new PHP Database Object with the address, username, and password as parameters 
     $pdo = new PDO('mysql:host=localhost;dbname=*****', $usernameDB, $passwordDB); 

     #Set pdo attributes to handle errors 
     $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     #assign the sth variable (sth means statement handle) to insert the data 
     $sth = $pdo->prepare("REPLACE INTO ***** SET name = ?, slideView = ?, company = ?"); 

     #Execute the insert 
     $sth->execute(array($name,$count,$company)); 

    #Error if can't connect or insert 
    } catch(PDOException $e) { 
     echo 'Error: ' . $e->getMessage(); 
    }#/try 
} 

मैं एसक्यूएल और havnt के लिए नया हूँ अभी तक यह करने के लिए एक अच्छा रास्ता मिल गया।

उत्तर

2

प्रतिस्थापन में ठीक काम करना चाहिए - यह अद्वितीय बाधाओं वाले कॉलम के लिए भी जांच करता है। तो आपको केवल mark your name column as unique की आवश्यकता होगी ताकि प्रतिस्थापन इसे डुप्लिकेट के रूप में पहचाना जा सके।

मैंने इस विशेष उपयोग मामले की कोशिश नहीं की है, लेकिन प्रलेखन इसे अनुमति देता है।

+0

मैंने मूल रूप से जो कुछ भी किया था उस पर वापस जाना चुना। एक बार मैंने अपना नाम कॉलम अद्वितीय चिह्नित किया। धन्यवाद! – mdance

4

आप इसके लिए insert ... on duplicate update सिंटैक्स का उपयोग करने के बेहतर हो सकते हैं, हालांकि इसका मतलब कुछ अतिरिक्त पैराम पास करना होगा, लेकिन यह कुछ problems in the replace into सिंटैक्स को क्रैश कर सकता है जो फसल लग रहा है।

REPLACE INTO ***** SET name = ?, slideView = ?, company = ? 

रूप में लिखा जा सकता है:

insert into yourTableName (name, slideView, company) 
    values (:name, :slideView, :company) 
    on duplicate key update set 
     slideView=:$slideView2, company=:company2 

और उसके बाद निष्पादित इस तरह से किया जाता है:

$sth->execute(array(':name' => $name, ':slideView' => $count, 
    ':company' => $company, ':slideView2' => $count, ':company2' => $company)); 

प्रारूप paramaters ऊपर नाम का उपयोग करता है (वे कभी भी इतना आसान को पढ़ने के लिए कर रहे हैं/डीबग) और डेटाबेस में एक नई पंक्ति डालेंगे - या यदि अद्वितीय/प्राथमिक कुंजी कॉलम name में पहले से ही मान है, तो शेष जानकारी के साथ पंक्ति को अपडेट करें।

आपको यहां दो बार पैरामीटर का उपयोग करना होगा (भले ही स्लाइडव्यू और कंपनी में एक ही जानकारी होगी) क्योंकि कोई पैरामीटर किसी क्वेरी में दो बार उपयोग नहीं किया जा सकता है।

+0

यह सही लगता है। हालांकि यह इस त्रुटि को फेंक रहा है: 'त्रुटि: SQLSTATE [42000]: सिंटेक्स त्रुटि या उल्लंघन उल्लंघन: 1064 आपको अपने SQL वाक्यविन्यास में कोई त्रुटि है; लाइन 1' – mdance

+0

पर 'SET slideView = NULL, company = NULL' के पास उपयोग करने के लिए सही वाक्यविन्यास के लिए आपके MySQL सर्वर संस्करण से मेल खाने वाले मैन्युअल की जांच करें, इसके अलावा, मैं MySQL संस्करण '5.1.61' – mdance

+0

चला रहा हूं, मैंने' SET' हटा दिया है और क्वेरी भाग गई, हालांकि यह कुछ भी अपडेट नहीं किया - बस हर बार नई पंक्तियों को जोड़ना जारी रखा। – mdance

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