Inside the backyard boozer crowned Britain's Pub Shed of the Year... after its owners spent £25,000 on creating an at-home sports bar
You could own AI.slop, if applicant for new global top-level domains get their way
When and where you can see the Red Arrows over Essex TODAY
When and where you can see the Red Arrows over Essex TODAY
Middlesbrough 'risks descending into carnage' after 'gangland revenge house fire murder' of seven-year-old girl and her aunt 'linked to A66 crash that killed five youths and two police officers'
CodeSOD: The Big Family
Some time ago, Charles shared with us some awful PHP, aka the most common sort. Today's code sample is maybe a little too big to sum up, but I'll let Charles take a crack at it.
It's so bad that even analyzing and laughing at it feels impossible. But it’s so bad, I couldn’t not share it.
I’m the only one handling all the IT-related tasks at my company, and I don’t have anyone here to vent or laugh about this kind of thing with. So, I figured, why not share it here? I’m hoping it’ll provide at least a little bit of catharsis or some dark humor.
To make sure the confidentiality of the codebase was respected, I took the liberty of generalizing it. You might notice some inconsistencies, but that’s just me trying to keep things neutral while protecting the original structure and functionality. Apologies if it looks a bit patchy – the goal was to avoid revealing any specific details or sensitive code.
The whole block is north of 400 lines, and it's doing a lot. Or well, maybe it's not, as you'll see.
Let's star with the outermost layer.
$resm_data = $data_source->fetchData("group=" . $item_id); foreach ($resm_data as $key => $value) { // rest of the code here }We fetch data from a data source, presumably a database, passing our condition as a string, which reeks of probable SQL injection, but I don't know what library they're using. I also note they're using the key/value style of array iteration, but never actually check the key.
$option_id = $value->option_id; $resm_details = $detail_source->fetch($option_id); if ($resm_details) { $label = $resm_details->{"label$lang"}; $description = $resm_details->{"description$lang"}; $category = $resm_details->category;Nice little bit of "meta" programming to get their localization working, it'll fetch labelen or labelde as needed. Definitely not a horrible, dangerous way to solve that problem.
We use that again to get our currency figured out. That lets us do number formatting. So much number formatting code.
if ($category == 0) { $cost = $resm_details->{"cost" . $currency}; $child_cost = $resm_details->{"child_cost" . $currency}; $cost_info = $mot[101] . " : +" . number_format($cost, 2, ",", " ") . $currency_symbol . " - " . $mot[102] . " : +" . number_format($child_cost, 2, ",", " ") . $currency_symbol; } elseif ($category == 1) { $cost = $resm_details->{"cost" . $currency}; $child_cost = 0; $cost_info = $mot[101] . " : +" . number_format($cost, 2, ",", " ") . $currency_symbol; } elseif ($category == 2) { $cost = 0; $child_cost = $resm_details->{"child_cost" . $currency}; $cost_info = $mot[102] . " : +" . number_format($child_cost, 2, ",", " ") . $currency_symbol; } elseif ($category == 4) { $cost = $resm_details->{"cost" . $currency}; $child_cost = 0; $cost_info = $mot[500] . " : +" . number_format($cost, 2, ",", " ") . $currency_symbol; } elseif ( $resm_details->{"cost" . $currency} == 0 and $resm_details->{"child_cost" . $currency} == 0 ) { $cost = 0; $child_cost = 0; $cost_info = ""; } else { $cost = $resm_details->{"cost" . $currency}; $child_cost = 0; $cost_info = $mot[200] . " : +" . number_format($cost, 2, ",", " ") . $currency_symbol; }What is the $mot array? Why am I jumping to seemingly random locations in that array? Clearly it contains some headers for our output.
Anyway, there's plenty of HTML string munging happening too, don't you worry.
if ($location == 1) { $quantity_block = '<div class="quantity-container"> <input type="text" value="1" id="quantity-' . $option_id . '" class="qty-control" name="quantity" min="1" max="1"> <div class="increase button">+</div> <div class="decrease button">-</div> </div>'; $quantity = 1; } else { $quantity_block = ""; $quantity = "all"; }And then there's this little treat for parsing the time stored in our database: $time_data = json_decode($resm_details->time_data); That tells me they're storing date times as strings, so that's fun.
There are also a couple more bon mots as they build a drop down list:
$departure_select = '<option value="-1">' . $mot[300] . '</option>'; $arrival_select = '<option value="-1">' . $mot[301] . '</option>';And then there's this monstrosity:
// Add the main option to the template $TEMPLATE->SET_BLOCK_VARIABLES("Block_OPTIONS", [ "ID" => $option_id, "QUANTITY" => $quantity, "LABEL_CLASS" => $label_class, "ACTION_CLASS" => $action_class, "LABEL" => $label, "DESCRIPTION" => $description, "QUANTITY_BLOCK" => $quantity_block, "COST_INFO" => $cost_info, "HOST_COST_DISPLAY" => $host_cost_display, "COST" => $cost, "CHILD_COST" => $child_cost, "LOCATION" => $location, "CATEGORY" => $category, "HOST_CLASS" => $host_class, "EXTRA" => $extra, "HOST_EXTRA" => $host_extra, "TIME_CHECKED" => ($has_times == 1) ? 'selected="' . $option_id . '" checked="true"' : '', "TIME_BLOCK" => $time_block ]);All the nonsense that we concatenate together above gets shoved into some sort of template. And after that, that's where the good stuff starts. Because guess what? We have to do the same thing for child items.
$resm_children_data = $data_source->fetchData("parent=" . $option_id); foreach ($resm_children_data as $child_key => $child_value) { $child_option_id = $child_value->option_id; $resm_child_details = $detail_source->fetch($child_option_id);That's right, it's the same block of code, not quite copy/pasted, since they needed to put the word child in everything.
// Add the child option to the template $TEMPLATE->SET_BLOCK_VARIABLES("Block_OPTIONS.Block_OPTIONS_CHILD", [ "ID" => $child_option_id, "QUANTITY" => $child_quantity, "LABEL_CLASS" => $child_label_class, "ACTION_CLASS" => $child_action_class, "LABEL" => $child_label, "DESCRIPTION" => $child_description, "QUANTITY_BLOCK" => $child_quantity_block, "COST_INFO" => $child_cost_info, "HOST_COST_DISPLAY" => $child_host_cost_display, "COST" => $child_cost, "CHILD_COST" => $child_extra_cost, "LOCATION" => $child_location, "CATEGORY" => $child_category, "HOST_CLASS" => $child_host_class, "EXTRA" => $child_extra, "HOST_EXTRA" => $child_host_extra, "TIME_CHECKED" => ($child_has_times == 1) ? 'selected="' . $child_option_id . '" checked="true"' : '', "TIME_BLOCK" => $child_time_block ]);And now, if you liked the child record, guess what? Those children have got siblings. What can I say, it's a big family.
$resm_sibling_data = $data_source->fetchData("parent=" . $parent_option_id); foreach ($resm_sibling_data as $sibling_key => $sibling_value) { $sibling_option_id = $sibling_value->option_id; $resm_sibling_details = $detail_source->fetch($sibling_option_id);And that means, yes, we also use that template thing again:
// Add the sibling option to the template $TEMPLATE->SET_BLOCK_VARIABLES("Block_OPTIONS.Block_OPTIONS_CHILD", [ "ID" => $sibling_option_id, "QUANTITY" => $sibling_quantity, "LABEL_CLASS" => $sibling_label_class, "ACTION_CLASS" => $sibling_action_class, "LABEL" => $sibling_label, "DESCRIPTION" => $sibling_description, "QUANTITY_BLOCK" => $sibling_quantity_block, "COST_INFO" => $sibling_cost_info, "HOST_COST_DISPLAY" => $sibling_host_cost_display, "COST" => $sibling_cost, "SIBLING_COST" => $sibling_extra_cost, "LOCATION" => $sibling_location, "CATEGORY" => $sibling_category, "HOST_CLASS" => $sibling_host_class, "EXTRA" => $sibling_extra, "HOST_EXTRA" => $sibling_host_extra, "TIME_CHECKED" => ($sibling_has_times == 1) ? 'selected="' . $sibling_option_id . '" checked="true"' : '', "TIME_BLOCK" => $sibling_time_block ]);Someday, I hope the person who wrote this learn about methods and function calls. Maybe they could write their own one day.
In any case, here's the whole thing:
$resm_data = $data_source->fetchData("group=" . $item_id); foreach ($resm_data as $key => $value) { $option_id = $value->option_id; $resm_details = $detail_source->fetch($option_id); if ($resm_details) { $label = $resm_details->{"label$lang"}; $description = $resm_details->{"description$lang"}; $category = $resm_details->category; // Process cost based on category if ($category == 0) { $cost = $resm_details->{"cost" . $currency}; $child_cost = $resm_details->{"child_cost" . $currency}; $cost_info = $mot[101] . " : +" . number_format($cost, 2, ",", " ") . $currency_symbol . " - " . $mot[102] . " : +" . number_format($child_cost, 2, ",", " ") . $currency_symbol; } elseif ($category == 1) { $cost = $resm_details->{"cost" . $currency}; $child_cost = 0; $cost_info = $mot[101] . " : +" . number_format($cost, 2, ",", " ") . $currency_symbol; } elseif ($category == 2) { $cost = 0; $child_cost = $resm_details->{"child_cost" . $currency}; $cost_info = $mot[102] . " : +" . number_format($child_cost, 2, ",", " ") . $currency_symbol; } elseif ($category == 4) { $cost = $resm_details->{"cost" . $currency}; $child_cost = 0; $cost_info = $mot[500] . " : +" . number_format($cost, 2, ",", " ") . $currency_symbol; } elseif ( $resm_details->{"cost" . $currency} == 0 and $resm_details->{"child_cost" . $currency} == 0 ) { $cost = 0; $child_cost = 0; $cost_info = ""; } else { $cost = $resm_details->{"cost" . $currency}; $child_cost = 0; $cost_info = $mot[200] . " : +" . number_format($cost, 2, ",", " ") . $currency_symbol; } $location = $resm_details->location; $label_class = $location == 1 ? "has-quantity" : "no-quantity"; $action_class = $location == 1 ? "active-with-quantity" : "active-no-quantity"; if ($location == 1) { $quantity_block = '<div class="quantity-container"> <input type="text" value="1" id="quantity-' . $option_id . '" class="qty-control" name="quantity" min="1" max="1"> <div class="increase button">+</div> <div class="decrease button">-</div> </div>'; $quantity = 1; } else { $quantity_block = ""; $quantity = "all"; } $has_times = $resm_details->has_times; if ($has_times == 1) { $time_counter++; $time_data = json_decode($resm_details->time_data); $departure_select = '<option value="-1">' . $mot[300] . '</option>'; $arrival_select = '<option value="-1">' . $mot[301] . '</option>'; $departures = $time_data->departures; $arrivals = $time_data->arrivals; foreach ($departures as $dep_key => $departure) { $departure_select .= '<option value="' . $dep_key . '">' . $departure . '</option>'; } foreach ($arrivals as $arr_key => $arrival) { $arrival_select .= '<option value="' . $arr_key . '">' . $arrival . '</option>'; } $departure_block = '<div class="col-half time-select-' . $option_id . '" style="padding-right: 0;"> <select class="form-control time-departure" style="text-align: center;">' . $departure_select . '</select> </div>'; $arrival_block = '<div class="col-half time-select-' . $option_id . '" style="padding-left: 0;"> <select class="form-control time-arrival" style="text-align: center;">' . $arrival_select . '</select> </div>'; $time_block = '<div class="row time-container"> ' . $departure_block . $arrival_block . ' </div><small class="error-message time-error">' . $mot[302] . '</small>'; } else { $time_block = ''; } $host_cost_display = ""; $extra = $resm_details->extra; $host_extra = $resm_details->host_extra; $host_class = ""; if ($extra == 1) { $extra_cost_1 = $resm_details->{"cost" . $currency . "_1"}; $extra_cost_2 = $resm_details->{"cost" . $currency . "_2"}; $default_extra = $host_price == 0 ? $extra_cost_2 : $extra_cost_1; $cost_info = $mot[101] . ' : +<span class="extra-cost">' . number_format($default_extra, 2, ",", " ") . "</span>" . $currency_symbol . " - " . $mot[102] . ' : +<span class="child-cost">0.00</span>' . $currency_symbol; $host_class = " extra-option"; } if ($host_extra == 1) { $host_cost_display = '<span class="host-cost">' . $mot[500] . ' : +<span class="host-price">0.00</span>' . $currency_symbol . "</span><br>"; } // Add the main option to the template $TEMPLATE->SET_BLOCK_VARIABLES("Block_OPTIONS", [ "ID" => $option_id, "QUANTITY" => $quantity, "LABEL_CLASS" => $label_class, "ACTION_CLASS" => $action_class, "LABEL" => $label, "DESCRIPTION" => $description, "QUANTITY_BLOCK" => $quantity_block, "COST_INFO" => $cost_info, "HOST_COST_DISPLAY" => $host_cost_display, "COST" => $cost, "CHILD_COST" => $child_cost, "LOCATION" => $location, "CATEGORY" => $category, "HOST_CLASS" => $host_class, "EXTRA" => $extra, "HOST_EXTRA" => $host_extra, "TIME_CHECKED" => ($has_times == 1) ? 'selected="' . $option_id . '" checked="true"' : '', "TIME_BLOCK" => $time_block ]); $resm_children_data = $data_source->fetchData("parent=" . $option_id); foreach ($resm_children_data as $child_key => $child_value) { $child_option_id = $child_value->option_id; $resm_child_details = $detail_source->fetch($child_option_id); if ($resm_child_details) { $child_label = $resm_child_details->{"label$lang"}; $child_description = $resm_child_details->{"description$lang"}; $child_category = $resm_child_details->category; // Process cost for child category if ($child_category == 0) { $child_cost = $resm_child_details->{"cost" . $currency}; $child_extra_cost = $resm_child_details->{"child_cost" . $currency}; $child_cost_info = $mot[101] . " : +" . number_format($child_cost, 2, ",", " ") . $currency_symbol . " - " . $mot[102] . " : +" . number_format($child_extra_cost, 2, ",", " ") . $currency_symbol; } elseif ($child_category == 1) { $child_cost = $resm_child_details->{"cost" . $currency}; $child_extra_cost = 0; $child_cost_info = $mot[101] . " : +" . number_format($child_cost, 2, ",", " ") . $currency_symbol; } elseif ($child_category == 2) { $child_cost = 0; $child_extra_cost = $resm_child_details->{"child_cost" . $currency}; $child_cost_info = $mot[102] . " : +" . number_format($child_extra_cost, 2, ",", " ") . $currency_symbol; } elseif ($child_category == 4) { $child_cost = $resm_child_details->{"cost" . $currency}; $child_extra_cost = 0; $child_cost_info = $mot[500] . " : +" . number_format($child_cost, 2, ",", " ") . $currency_symbol; } elseif ( $resm_child_details->{"cost" . $currency} == 0 and $resm_child_details->{"child_cost" . $currency} == 0 ) { $child_cost = 0; $child_extra_cost = 0; $child_cost_info = ""; } else { $child_cost = $resm_child_details->{"cost" . $currency}; $child_extra_cost = 0; $child_cost_info = $mot[200] . " : +" . number_format($child_cost, 2, ",", " ") . $currency_symbol; } $child_location = $resm_child_details->location; $child_label_class = $child_location == 1 ? "has-quantity" : "no-quantity"; $child_action_class = $child_location == 1 ? "active-with-quantity" : "active-no-quantity"; if ($child_location == 1) { $child_quantity_block = '<div class="quantity-container"> <input type="text" value="1" id="child-quantity-' . $child_option_id . '" class="qty-control" name="quantity" min="1" max="1"> <div class="increase button">+</div> <div class="decrease button">-</div> </div>'; $child_quantity = 1; } else { $child_quantity_block = ""; $child_quantity = "all"; } $child_has_times = $resm_child_details->has_times; if ($child_has_times == 1) { $child_time_counter++; $child_time_data = json_decode($resm_child_details->time_data); $child_departure_select = '<option value="-1">' . $mot[300] . '</option>'; $child_arrival_select = '<option value="-1">' . $mot[301] . '</option>'; $child_departures = $child_time_data->departures; $child_arrivals = $child_time_data->arrivals; foreach ($child_departures as $child_dep_key => $child_departure) { $child_departure_select .= '<option value="' . $child_dep_key . '">' . $child_departure . '</option>'; } foreach ($child_arrivals as $child_arr_key => $child_arrival) { $child_arrival_select .= '<option value="' . $child_arr_key . '">' . $child_arrival . '</option>'; } $child_departure_block = '<div class="col-half time-select-' . $child_option_id . '" style="padding-right: 0;"> <select class="form-control time-departure" style="text-align: center;">' . $child_departure_select . '</select> </div>'; $child_arrival_block = '<div class="col-half time-select-' . $child_option_id . '" style="padding-left: 0;"> <select class="form-control time-arrival" style="text-align: center;">' . $child_arrival_select . '</select> </div>'; $child_time_block = '<div class="row time-container"> ' . $child_departure_block . $child_arrival_block . ' </div><small class="error-message time-error">' . $mot[302] . '</small>'; } else { $child_time_block = ''; } $child_host_cost_display = ""; $child_extra = $resm_child_details->extra; $child_host_extra = $resm_child_details->host_extra; $child_host_class = ""; if ($child_extra == 1) { $child_extra_cost_1 = $resm_child_details->{"cost" . $currency . "_1"}; $child_extra_cost_2 = $resm_child_details->{"cost" . $currency . "_2"}; $default_child_extra = $host_price == 0 ? $child_extra_cost_2 : $child_extra_cost_1; $child_cost_info = $mot[101] . ' : +<span class="extra-cost">' . number_format($default_child_extra, 2, ",", " ") . "</span>" . $currency_symbol . " - " . $mot[102] . ' : +<span class="child-cost">0.00</span>' . $currency_symbol; $child_host_class = " extra-option"; } if ($child_host_extra == 1) { $child_host_cost_display = '<span class="host-cost">' . $mot[500] . ' : +<span class="host-price">0.00</span>' . $currency_symbol . "</span><br>"; } // Add the child option to the template $TEMPLATE->SET_BLOCK_VARIABLES("Block_OPTIONS.Block_OPTIONS_CHILD", [ "ID" => $child_option_id, "QUANTITY" => $child_quantity, "LABEL_CLASS" => $child_label_class, "ACTION_CLASS" => $child_action_class, "LABEL" => $child_label, "DESCRIPTION" => $child_description, "QUANTITY_BLOCK" => $child_quantity_block, "COST_INFO" => $child_cost_info, "HOST_COST_DISPLAY" => $child_host_cost_display, "COST" => $child_cost, "CHILD_COST" => $child_extra_cost, "LOCATION" => $child_location, "CATEGORY" => $child_category, "HOST_CLASS" => $child_host_class, "EXTRA" => $child_extra, "HOST_EXTRA" => $child_host_extra, "TIME_CHECKED" => ($child_has_times == 1) ? 'selected="' . $child_option_id . '" checked="true"' : '', "TIME_BLOCK" => $child_time_block ]); $resm_sibling_data = $data_source->fetchData("parent=" . $parent_option_id); foreach ($resm_sibling_data as $sibling_key => $sibling_value) { $sibling_option_id = $sibling_value->option_id; $resm_sibling_details = $detail_source->fetch($sibling_option_id); if ($resm_sibling_details) { $sibling_label = $resm_sibling_details->{"label$lang"}; $sibling_description = $resm_sibling_details->{"description$lang"}; $sibling_category = $resm_sibling_details->category; // Process cost for sibling category if ($sibling_category == 0) { $sibling_cost = $resm_sibling_details->{"cost" . $currency}; $sibling_extra_cost = $resm_sibling_details->{"sibling_cost" . $currency}; $sibling_cost_info = $mot[101] . " : +" . number_format($sibling_cost, 2, ",", " ") . $currency_symbol . " - " . $mot[102] . " : +" . number_format($sibling_extra_cost, 2, ",", " ") . $currency_symbol; } elseif ($sibling_category == 1) { $sibling_cost = $resm_sibling_details->{"cost" . $currency}; $sibling_extra_cost = 0; $sibling_cost_info = $mot[101] . " : +" . number_format($sibling_cost, 2, ",", " ") . $currency_symbol; } elseif ($sibling_category == 2) { $sibling_cost = 0; $sibling_extra_cost = $resm_sibling_details->{"sibling_cost" . $currency}; $sibling_cost_info = $mot[102] . " : +" . number_format($sibling_extra_cost, 2, ",", " ") . $currency_symbol; } elseif ($sibling_category == 4) { $sibling_cost = $resm_sibling_details->{"cost" . $currency}; $sibling_extra_cost = 0; $sibling_cost_info = $mot[500] . " : +" . number_format($sibling_cost, 2, ",", " ") . $currency_symbol; } elseif ( $resm_sibling_details->{"cost" . $currency} == 0 and $resm_sibling_details->{"sibling_cost" . $currency} == 0 ) { $sibling_cost = 0; $sibling_extra_cost = 0; $sibling_cost_info = ""; } else { $sibling_cost = $resm_sibling_details->{"cost" . $currency}; $sibling_extra_cost = 0; $sibling_cost_info = $mot[200] . " : +" . number_format($sibling_cost, 2, ",", " ") . $currency_symbol; } $sibling_location = $resm_sibling_details->location; $sibling_label_class = $sibling_location == 1 ? "has-quantity" : "no-quantity"; $sibling_action_class = $sibling_location == 1 ? "active-with-quantity" : "active-no-quantity"; if ($sibling_location == 1) { $sibling_quantity_block = '<div class="quantity-container"> <input type="text" value="1" id="sibling-quantity-' . $sibling_option_id . '" class="qty-control" name="quantity" min="1" max="1"> <div class="increase button">+</div> <div class="decrease button">-</div> </div>'; $sibling_quantity = 1; } else { $sibling_quantity_block = ""; $sibling_quantity = "all"; } $sibling_has_times = $resm_sibling_details->has_times; if ($sibling_has_times == 1) { $sibling_time_counter++; $sibling_time_data = json_decode($resm_sibling_details->time_data); $sibling_departure_select = '<option value="-1">' . $mot[300] . '</option>'; $sibling_arrival_select = '<option value="-1">' . $mot[301] . '</option>'; $sibling_departures = $sibling_time_data->departures; $sibling_arrivals = $sibling_time_data->arrivals; foreach ($sibling_departures as $sibling_dep_key => $sibling_departure) { $sibling_departure_select .= '<option value="' . $sibling_dep_key . '">' . $sibling_departure . '</option>'; } foreach ($sibling_arrivals as $sibling_arr_key => $sibling_arrival) { $sibling_arrival_select .= '<option value="' . $sibling_arr_key . '">' . $sibling_arrival . '</option>'; } $sibling_departure_block = '<div class="col-half time-select-' . $sibling_option_id . '" style="padding-right: 0;"> <select class="form-control time-departure" style="text-align: center;">' . $sibling_departure_select . '</select> </div>'; $sibling_arrival_block = '<div class="col-half time-select-' . $sibling_option_id . '" style="padding-left: 0;"> <select class="form-control time-arrival" style="text-align: center;">' . $sibling_arrival_select . '</select> </div>'; $sibling_time_block = '<div class="row time-container"> ' . $sibling_departure_block . $sibling_arrival_block . ' </div><small class="error-message time-error">' . $mot[302] . '</small>'; } else { $sibling_time_block = ''; } $sibling_host_cost_display = ""; $sibling_extra = $resm_sibling_details->extra; $sibling_host_extra = $resm_sibling_details->host_extra; $sibling_host_class = ""; if ($sibling_extra == 1) { $sibling_extra_cost_1 = $resm_sibling_details->{"cost" . $currency . "_1"}; $sibling_extra_cost_2 = $resm_sibling_details->{"cost" . $currency . "_2"}; $default_sibling_extra = $host_price == 0 ? $sibling_extra_cost_2 : $sibling_extra_cost_1; $sibling_cost_info = $mot[101] . ' : +<span class="extra-cost">' . number_format($default_sibling_extra, 2, ",", " ") . "</span>" . $currency_symbol . " - " . $mot[102] . ' : +<span class="sibling-cost">0.00</span>' . $currency_symbol; $sibling_host_class = " extra-option"; } if ($sibling_host_extra == 1) { $sibling_host_cost_display = '<span class="host-cost">' . $mot[500] . ' : +<span class="host-price">0.00</span>' . $currency_symbol . "</span><br>"; } // Add the sibling option to the template $TEMPLATE->SET_BLOCK_VARIABLES("Block_OPTIONS.Block_OPTIONS_CHILD", [ "ID" => $sibling_option_id, "QUANTITY" => $sibling_quantity, "LABEL_CLASS" => $sibling_label_class, "ACTION_CLASS" => $sibling_action_class, "LABEL" => $sibling_label, "DESCRIPTION" => $sibling_description, "QUANTITY_BLOCK" => $sibling_quantity_block, "COST_INFO" => $sibling_cost_info, "HOST_COST_DISPLAY" => $sibling_host_cost_display, "COST" => $sibling_cost, "SIBLING_COST" => $sibling_extra_cost, "LOCATION" => $sibling_location, "CATEGORY" => $sibling_category, "HOST_CLASS" => $sibling_host_class, "EXTRA" => $sibling_extra, "HOST_EXTRA" => $sibling_host_extra, "TIME_CHECKED" => ($sibling_has_times == 1) ? 'selected="' . $sibling_option_id . '" checked="true"' : '', "TIME_BLOCK" => $sibling_time_block ]); } } } } } } .comment { border: none; }Britons support efforts to use more renewable energy - but question its effectiveness in bringing down bills
Is your hair suddenly looking greasy, lank or dull? Your hairbrush could be the problem - 7 things to know
An entire settlement destroyed in just seconds: Video shows huge torrent of floodwater bulldoze through buildings in Nepal as people try to outrun certain death
What REALLY happened inside a West Wing office on Elon Musk's wild final night in Trump's orbit? Find out in this week's DC Insider newsletter
Exact time and route Red Arrows to take on route to first day of Clacton Airshow
Rescuers battle to reach parts of Nepal obliterated by collapsed glacier flood amid fears thousands are dead: Hundreds of tourists' families face agonising wait for news of relatives caught in torrent as receding waters reveal grisly toll
Nutanix built $20m AI cluster to reduce use of Copilot and Claude, expects ROI in a year
Lindsay Clancy judge rules killer mom can be found guilty of MANSLAUGHTER rather than murder as her parents smile while leaving court
Pensioners who don't own their home need extra £419,000 saved to cover rent in retirement
Face of Chelmsford man who raped woman on the street in Southend
The Network Is More Of Nvidia’s Computer Than It Ever Was At Sun
Ex-girlfriend spared jail for bizarre abuse campaign against Hollyoaks and EastEnders actor
Bill Gates Proposes Major Limits On AI Development
Read more of this story at Slashdot.