2011-06-16 3 views
0

Это мой код:PHP MySQL вопрос (если заявление оленья кожа имеет эффект)

if ((isset($_POST['vidcode'])) && (strlen(trim($_POST['vidcode'])) > 0)) {$vidcode = stripslashes(strip_tags($_POST['vidcode']));} else {$vidcode = 'Invalid URL';}; 
if ((isset($_POST['vidtitle'])) && (strlen(trim($_POST['vidtitle'])) > 0)) {$vidtitle = stripslashes(strip_tags($_POST['vidtitle']));} else {$vidtitle = 'No Title';}; 
$vidcode = str_replace('"', '', $vidcode);$vidcode = str_replace("'", "", $vidcode);$vidtitle = str_replace('"', '', $vidtitle);$vidtitle = str_replace("'", "", $vidtitle); 

$db_handle = mysql_connect($server, $user_name, $password);$db_found = mysql_select_db($database, $db_handle); 
$SQL = "SELECT status FROM youtube2mp3 WHERE videocode = '$vidcode' ";$result = mysql_query($SQL); [BUGFIX:Added]$row = mysql_fetch_assoc($result);[/BUGFIX] 


if(mysql_num_rows($result) != false){ 


     // Add to DB & Set Status 
     $SQL = "UPDATE youtube2mp3 SET status='Download Complete' WHERE videocode='$vidcode'"; 
     $result = mysql_query($SQL); 

        [BUGFIX:Removed] 
     // Get Data into variable 
     $row = mysql_fetch_assoc($result); 
        [/BUGFIX] 

     // Check if its been processed 
     if (strcasecmp($row['status'], "Done") != 0){ 

     // Add to DB & Set Status 
     $SQL = "UPDATE youtube2mp3 SET status='Initializing Conversion' WHERE videocode='$vidcode'"; 
     $result = mysql_query($SQL); 

     $filename = $vidcode.'.mp4'; 

     if (!file_exists($filename) && !filesize($filename) >= 10000) { 
      $SQL = "UPDATE youtube2mp3 SET status='Invalid' WHERE videocode='$vidcode'"; 
      $result = mysql_query($SQL); 
     } else { 
      $SQL = "UPDATE youtube2mp3 SET status='Converting' WHERE videocode='$vidcode'"; 
      $result = mysql_query($SQL); 

      //convert file 
      exec('ffmpeg -i '.escapeshellarg($vidcode).'.mp4 -ab 156 -f mp3 '.escapeshellarg($vidtitle).'.mp3 2>&1'); 

      $SQL = "UPDATE youtube2mp3 SET status='Zipping' WHERE videocode='$vidcode'"; 
      $result = mysql_query($SQL); 

      // Zip it up 
      exec('zip "zips/'.$vidcode.'.zip" "'.$vidtitle.'.mp3"'); 

      //delete files 
      //unlink($vidcode.'.mp4'); 
      unlink($vidtitle.'.mp3'); 

      $SQL = "UPDATE youtube2mp3 SET status='Done' WHERE videocode='$vidcode'"; 
      $result = mysql_query($SQL); 
     }; 
     }; 
     }; 
mysql_close($db_handle); 

Право Просто FYI - Это был я глуп! Я повторно использовал $ result, который дал неожиданные результаты. См. [BUGFIX] в коде выше ...

ответ

1

Не используйте SELECT *..., явно указывайте свои столбцы в своих запросах. Таким образом, ясно, какие столбцы вы ожидаете получить от базы данных, просмотрев свой код. Кроме того, если окажется, что столбец, который, по вашему мнению, существует, не будет, вы получите сообщение об ошибке на этапе, где проблема на самом деле происходит - при извлечении данных, а не позже в вашем коде, когда вы пытаетесь использовать данные.

Также обратите внимание, что ваше использование mysql_fetch_array (docs) возвращает числовой индекс столбцов. Используйте mysql_fetch_assoc (docs) для ассоциативного массива.

$db_handle = mysql_connect($server, $user_name, $password); 
$db_found = mysql_select_db($database, $db_handle); 
$sql = ' 
     SELECT 
      `status`, 
      `some_other_field` 
     FROM 
      `table` 
     WHERE 
      `videocode` = "'.$vidcode.'"'; 
$result = mysql_query($sql, $db_handle) or die('Error while performing query: '.mysql_error($db_handle)); 

if (mysql_num_rows($result, $db_handle) < 1) { 
    // you didn't get any rows back... 
} 

if(mysql_num_rows($result) != false){ 
    // Get Data into variable 
    $row = mysql_fetch_assoc($result, $db_handle); 

    // Check if its been processed 
    if ($row['status'] != "Done"){ 
     // CODE HERE IS STILL GETTING EXECUTED EVEN WHEN $row['status'] IS "Done" 

    } 
} 

Используя этот код, если столбцы, которые вы пытаетесь выбрать, не существуют, вы получите ошибку базы данных.

+1

mysql_fetch_array по умолчанию для MYSQL_BOTH как тип результата и, таким образом, будет включать в себя как числовой массив, а также ассоциативные массив. Хотя не идея; не является проблемой. – Suroot

0

Вы используете mysql_fetch_array, который возвращает строку как индексированный массив 0. Вы должны использовать mysql_fetch_assoc

Попробуйте это:

if ((isset($_POST['vidcode'])) && (strlen(trim($_POST['vidcode'])) > 0)) { 
    $vidcode = stripslashes(strip_tags($_POST['vidcode'])); 
} else { 
    $vidcode = 'Invalid URL'; 
}; 

if ((isset($_POST['vidtitle'])) && (strlen(trim($_POST['vidtitle'])) > 0)) { 
    $vidtitle = stripslashes(strip_tags($_POST['vidtitle'])); 
} else { 
    $vidtitle = 'No Title'; 
}; 

$vidcode = str_replace('"', '', $vidcode); 
$vidcode = str_replace("'", "", $vidcode); 
$vidtitle = str_replace('"', '', $vidtitle); 
$vidtitle = str_replace("'", "", $vidtitle); 

$db_handle = mysql_connect($server, $user_name, $password); 
$db_found = mysql_select_db($database, $db_handle); 
$SQL = "SELECT * FROM table WHERE videocode = '$vidcode' "; 
$result = mysql_query($SQL); 
if(mysql_num_rows($result) != false) { 
     // Get Data into variable 
     $row = mysql_fetch_assoc($result); 

     // Check if its been processed 
     if (strcasecmp($row['status'], "Done") != 0) 
     { 

     // CODE HERE IS STILL GETTING EXECUTED EVEN WHEN $row['status'] IS "Done" 
     } 
    }; 
}; 
mysql_close($db_handle); 
+1

assoc/array не имеет значения – jtanner

+0

(что при изменении в моем коде не имело никакого эффекта) – jtanner

0

Я не внимательно прочитать то, что проблема, в общем, вы можете:

  1. Попробуйте это:

    error_reporting (E_ALL); ini_set ('display_errors', '1'); ini_set ('log_errors', 1); ini_set ('error_log', 'error_log.txt');

  2. Попробуйте оповестить (ответ), я имею в виду XML-ответ xml, это не так, что ajax не имеет выхода, ajax выводит результат точно со всеми ошибками php, если они есть! Если вы используете jquery, я думаю, что есть что-то похожее на HTTP-ответ.

  3. Когда код выполняется в странных местах, решение тривиально просто помещает эхо внутри каждого, если, каждый другой, каждая функция, конструктор независимо ... Как только вы увидите, что блок кода жив, когда предполагалось, что он не должен будьте сосредоточены там только!

  4. Когда вы подозреваете проблему в очень определенном месте, но вместо этого вы фокусируетесь на большой части кода (как в вашем случае), тогда в большинстве случаев вы должны забыть весь остальной код, это не будет помогать. Извините, если он слишком общий!

+0

«Ошибка» заключается в том, что он пропускает прошлое и выполняет код ... php не сообщает о какой-либо ошибке (мои отчеты включены) – jtanner

0

Может попробовать это:

if(strcasecmp(trim($row['status']), "DONE") != 0) { 

Или попробуйте время цикла

function validatePostValues($alt_response = 'Default', $post_value = NULL) { 
    if((isset($post_value)) && (strlen(trim($post_value)) > 0)) { 
     $return_value = stripslashes(strip_tags($post_value)); 

     $return_value = str_replace('"', '', $return_value); 
     $return_value = str_replace("'", "", $return_value); 
    } else { 
     $return_value = $alt_response; 
    } 
    return $return_value; 
} 
$vidcode = validatePostValues('Invalid URL', $_POST['vidcode']); 
$vidtitle = validatePostValues('No Title', $_POST['vidtitle']); 

$db_handle = mysql_connect($server, $user_name, $password); 
$db_found = mysql_select_db($database, $db_handle); 
$SQL  = "SELECT * FROM table WHERE videocode = '$vidcode' "; 
$result = mysql_query($SQL); 

if(mysql_num_rows($result)) { 
    // Loop through the results 
    while($row = mysql_fetch_assoc($result)) { 
     // Added for debugging, enclose w/ PIPE for 
     // whitespace check 
     echo "Status is: |".$row['status']."|<br />\n"; 

     // Check if its been processed 
     if($row['status'] != "Done"){ 
      // CODE HERE IS STILL GETTING EXECUTED 
      // EVEN WHEN $row['status'] IS "Done" 
      echo "Row: ".print_r($row,true)."<br />\n"; 
     } 
    } 
} 
mysql_close($db_handle); 
Смежные вопросы