2012-09-10 15 views
5

के माध्यम से उपयोग करते समय मैं अपने डेटाबेस में पुनः-हैश उपयोगकर्ता आईडी का प्रयास कर रहा हूं, लेकिन मैं अटक गया हूं।MySQL वाक्यविन्यास त्रुटि, लेकिन केवल PHP

<?php 
include("session.php"); 
include("functions.php"); 
$conn = ConnectMySQL(); 
setTimezone($session->username); 

$sql = "SELECT username, userid FROM users"; 
$result = mysql_query($sql) or die(mysql_error()); 
while($rows = mysql_fetch_array($result)){ 
    $username = $rows['username']; 
    $old = mysql_real_escape_string($rows['userid']); 
    $new = mysql_real_escape_string($session->generateRandID()); 

    $moresql = "START TRANSACTION; 
       UPDATE users SET userid='$new' WHERE userid='$old'; 
       UPDATE comments SET user='$new' WHERE user='$old'; 
       UPDATE forum_posts SET poster_name='$new' WHERE poster_name='$old'; 
       UPDATE forum_topics SET topic_poster_name='$new' WHERE topic_poster_name='$old'; 
       UPDATE images SET author='$new' WHERE author='$old'; 
       UPDATE likes SET user='$new' WHERE user='$old'; 
       UPDATE music SET author='$new' WHERE author='$old'; 
       UPDATE ratings SET user='$new' WHERE user='$old'; 
       COMMIT;"; 
    $newresult = mysql_query($moresql) or die(mysql_error()); 
    if(!$newresult){echo "There was a problem with changing $username's hash. \n";} 
    else{echo "Changed $username's hash<i>!</i> \n";} 
} 
mysql_close($conn); 
?> 

पूरे क्वेरी PHPMyAdmin के माध्यम से पूरी तरह से ठीक काम करता है, बस स्पष्ट रूप से शून्य पंक्तियां देता है। लेकिन जब मैं के साथ प्रयास करें वास्तविक मान पीएचपी के साथ यह हो जाता है का उपयोग कर चूसना इसके माध्यम से पारित किया जा रहा:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE users SET userid='b8aca4b680707453fa4dfe1bf1d0fddb' WHERE userid='8' at line 2 

वहाँ कोई अन्य त्रुटियाँ हैं - मैं एक नुकसान में हूँ कि यह क्या है के बारे में सोचना। अग्रिम धन्यवाद,

सैम

+0

पूरी तरह से असंबंधित, लेकिन अपने 'if (! $ newresult)' लाइन कभी नहीं क्योंकि चलाया जाएगा जिस मामले में '$ newresult'' FALSE' के बराबर है 'पहले से ही 'या मर (mysql_error()) से ढका हुआ है;'। सिर्फ मन में रखने वाली कुछ बातें। – Palladium

उत्तर

7

एकाधिक प्रश्नों mysql_query द्वारा समर्थित नहीं हैं()। आपको एक समय में एक प्रश्न निष्पादित करना होगा। http://php.net/manual/en/function.mysql-query.php

+0

बढ़िया, धन्यवाद! :) – 2xAA

2

देखें documentation से:

mysql_query() sends a unique query (multiple queries are not supported) 

आप PHP के माध्यम से डेटाबेस के लिए प्रश्नों की एक श्रृंखला भेज cant't। अपने वास्तविक डेटाबेस पर एक प्रक्रिया लिखने पर विचार करें और फिर उसे php से कॉल करें।

इसके अलावा, उन कार्यों को बहिष्कृत कर दिया गया है। आपको एक अलग पुस्तकालय पर विचार करना चाहिए। PDO एक लोकप्रिय है।

1

विचार मैं आम तौर पर जब लेन-देन के साथ काम करने का उपयोग इस (सेमी-छद्म कोड) की तरह दिखता है:

try { 
    // First of all, let's begin a transaction 
    $db->beginTransaction(); 

    // A set of queries ; of one fails, an exception should be thrown 
    $db->query('first query'); 
    $db->query('second query'); 
    $db->query('third query'); 

    // If we arrive here, it means that no exception was thrown 
    // i.e. no query has failed ; and we can commit the transaction 
    $db->commit(); 
} catch (Exception $e) { 
    // An exception has been thrown 
    // We must rollback the transaction 
    $db->rollback(); 
} 

ध्यान दें कि, इस विचार के साथ, अगर एक प्रश्न विफल रहता है, एक अपवाद उत्पन्न किया जाना चाहिए:

पीडीओ ऐसा कर सकते हैं, आप इसे कैसे कॉन्फ़िगर देखें पीडीओ :: setAttribute और पीडीओ :: ATTR_ERRMODE और पीडीओ :: ERRMODE_EXCEPTION बाकी, कुछ अन्य एपीआई के साथ के आधार पर आप का इस्तेमाल किया फ़ंक्शन के परिणाम का परीक्षण करना पड़ सकता है एक क्वेरी निष्पादित करने के लिए, और एक अपवाद फेंक दें।

दुर्भाग्यवश, इसमें कोई जादू शामिल नहीं है: आप केवल एक निर्देश नहीं डाल सकते हैं और लेन-देन स्वचालित रूप से किए जा सकते हैं: आपको अभी भी यह निर्धारित करना होगा कि लेनदेन में प्रश्नों का कौन सा समूह निष्पादित किया जाना चाहिए।

उदाहरण के लिए, अक्सर लेनदेन से पहले कुछ प्रश्न पूछेंगे (शुरुआत से पहले), और लेनदेन के बाद कुछ अन्य प्रश्न (या तो प्रतिबद्ध या रोलबैक के बाद); और आप उन प्रश्नों को निष्पादित करना चाहते हैं चाहे लेनदेन में क्या हुआ (या नहीं)।

============================================== =======

आप mysqli भी के लिए एक ही

प्राप्त करने के लिए उपयोग कर सकते हैं पूर्व

<?php 
$link = mysqli_connect("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

/* disable autocommit */ 
mysqli_autocommit($link, FALSE); 

mysqli_query($link, "CREATE TABLE myCity LIKE City"); 
mysqli_query($link, "ALTER TABLE myCity Type=InnoDB"); 
mysqli_query($link, "INSERT INTO myCity SELECT * FROM City LIMIT 50"); 

/* commit insert */ 
mysqli_commit($link); 
संबंधित मुद्दे