2012-12-16 4 views
1

У меня есть следующий PHP-код, который должен загружать данные из CSS-файла в переменную, искать цвет фона старого тела, заменять его цветом из представленной формы, сохранять файл CSS и, наконец, обновлять цвет в база данных. Проблема в том, что str_replace не заменяет ничего.Почему str_replace не заменяет эту строку?

Вот мой PHP код (хранится в "процессоров/save_program_settings.php"):

<?php 
require("../security.php"); 

$institution_name = mysql_real_escape_string($_POST['institution_name']); 
$staff_role_title = mysql_real_escape_string($_POST['staff_role_title']); 
$program_location = mysql_real_escape_string($_POST['program_location']); 
$background_colour = mysql_real_escape_string($_POST['background_colour']); 
$bar_border_colour = mysql_real_escape_string($_POST['bar_border_colour']); 
$title_colour = mysql_real_escape_string($_POST['title_colour']); 

$url = $global_variables['program_location']; 

$data_background = mysql_query("SELECT * FROM sents_global_variables WHERE name='background_colour'") or die(mysql_error()); 
$background_output = mysql_fetch_array($data_background); 
$css = file_get_contents($url.'/default.css'); 
$str = "body { background-color: #".$background_output['data']."; }"; 
$str2 = "body { background-color: #".$background_colour."; }"; 
$css2 = str_replace($str, $str2, $css); 

unlink('../default.css'); 
file_put_contents('../default.css', $css2); 

mysql_query("UPDATE sents_global_variables SET data='{$institution_name}' WHERE name='institution_name'") or die(mysql_error()); 
mysql_query("UPDATE sents_global_variables SET data='{$staff_role_title}' WHERE name='role_title'") or die(mysql_error()); 
mysql_query("UPDATE sents_global_variables SET data='{$program_location}' WHERE name='program_location'") or die(mysql_error()); 
mysql_query("UPDATE sents_global_variables SET data='{$background_colour}' WHERE name='background_colour'") or die(mysql_error()); 
mysql_query("UPDATE sents_global_variables SET data='{$bar_border_colour}' WHERE name='bar_border_colour'") or die(mysql_error()); 
mysql_query("UPDATE sents_global_variables SET data='{$title_colour}' WHERE name='title_colour'") or die(mysql_error()); 

header('Location: '.$url.'/pages/start.php?message=program_settings_saved'); 
?> 

Вот мой CSS (хранится в "default.css"):

@charset "utf-8"; 
/* CSS Document */ 

body,td,th { 
    font-family: Arial, Helvetica, sans-serif; 
    font-size: 14px; 
    color: #000; 
} 
body { 
    background-color: #CCCCFF; 
} 
.main_table th { 
    background:#003399; 
    font-size:24px; 
    color:#FFFFFF; 
} 
.main_table { 
    background:#FFF; 
    border:#003399 solid 1px; 
} 
.subtitle { 
    font-size:20px; 
} 
input#login_username, input#login_password { 
    height:30px; 
    width:300px; 
    font-size:24px; 
} 
input#login_submit { 
    height:30px; 
    width:150px; 
    font-size:16px; 
} 
.timetable_cell_lesson { 
    width:100px; 
    font-size:10px; 
} 
.timetable_cell_tutorial_a, .timetable_cell_tutorial_b, .timetable_cell_break, .timetable_cell_lunch { 
    width:100px; 
    background:#999; 
    font-size:10px; 
} 

I «ве выполняются некоторые проверки, используя следующий код в PHP файл:

echo $css . "<br><br>" . $str . "<br><br>" . $str2 . "<br><br>" . $css2; exit; 

И это выводит (как вы можете видеть, что это ничего не меняется в CSS):

@charset "utf-8"; /* CSS Document */ body,td,th { font-family: Arial, Helvetica, sans-serif; font-size: 14px; color: #000; } body { background-color: #CCCCFF; } .main_table th { background:#003399; font-size:24px; color:#FFFFFF; } .main_table { background:#FFF; border:#003399 solid 1px; } .subtitle { font-size:20px; } input#login_username, input#login_password { height:30px; width:300px; font-size:24px; } input#login_submit { height:30px; width:150px; font-size:16px; } .timetable_cell_lesson { width:100px; font-size:10px; } .timetable_cell_tutorial_a, .timetable_cell_tutorial_b, .timetable_cell_break, .timetable_cell_lunch { width:100px; background:#999; font-size:10px; } 

body { background-color: #CCCCFF; } 

body { background-color: #FF5719; } 

@charset "utf-8"; /* CSS Document */ body,td,th { font-family: Arial, Helvetica, sans-serif; font-size: 14px; color: #000; } body { background-color: #CCCCFF; } .main_table th { background:#003399; font-size:24px; color:#FFFFFF; } .main_table { background:#FFF; border:#003399 solid 1px; } .subtitle { font-size:20px; } input#login_username, input#login_password { height:30px; width:300px; font-size:24px; } input#login_submit { height:30px; width:150px; font-size:16px; } .timetable_cell_lesson { width:100px; font-size:10px; } .timetable_cell_tutorial_a, .timetable_cell_tutorial_b, .timetable_cell_break, .timetable_cell_lunch { width:100px; background:#999; font-size:10px; } 
+0

Вместо того чтобы проходить через все эти хлопоты, почему бы не просто установить заголовок для css, и сделать css динамическим? Btw mysql_ * устарел. Вместо этого используйте mysqli или pdo. – itachi

ответ

1

Я считаю, что проблема может быть, что вы пытаетесь заменить это:

body { 
    background-color: #CCCCFF; 
} 

, пытаясь найти это в вашем файле CSS:

body { background-color: #CCCCFF; } 

Простейшим решением на мой взгляд было бы просто правильно форматировать эту строку в файле CSS

+0

Это работает, спасибо! :) – Niall

1

Возможно, проблема заключается в \ n "

эта линия:

$css = file_get_contents($url.'/default.css'); 

должен быть

$css = file_get_contents($url.'/default.css'); 
$css = str_replace("\n","", $css); 

Или вы можете использовать preg_replace.

+0

Хотя это сработает, вы получите файл css, который труднее для человека читать, когда вы сбросите его обратно. Если вы поехали по этому пути, вы должны заменить \ n на какой-то другой символ, который не существует в файле, а затем верните \ n, прежде чем записывать содержимое обратно. – TheRuss

+0

@ TheRuss, конечно, вы правы, в этом случае лучшим решением будет использование preg_replace –

1

file_get_contents() сохраняет разрывы строк, но браузер не делает, вы ничего не получаете заменить, потому что ваш файл CSS не содержит

body { background-color: #CCCCFF; } 

Вы были скинул немного на тестировании, потому что, когда вы эхом из содержимого $ css разрывы строк, кажется, были удалены. Это артефакт браузера, игнорирующий пробелы, но вы можете быть уверены, что исходные пробелы все еще находятся в источнике.

Вы можете рассмотреть preg_replace и использовать регулярное выражение для поиска дополнительных разрывов строк. Вы также можете сделать 3-ступенчатую замену, заменив новые строки на какой-либо другой маркер, выполнив первоначальную замену, а затем снова включив новые строки.

+0

Спасибо, я думал, что PHP видит CSS точно так же, как и отображался. – Niall

Смежные вопросы