AdRock
Members-
Posts
913 -
Joined
-
Last visited
Profile Information
-
Gender
Not Telling
AdRock's Achievements
Advanced Member (4/5)
1
Reputation
-
I have 2 queries that I want to join together to make one row This queries returns all rows from both tables which is what i want SELECT table_A.*, table_B.* FROM table_A INNER JOIN table_B ON table_A.code = table_B.code and this is the output table_A.id | table_A.code | table_B.id | table_B.code | table_B.complete =============================================================================================== 1 | 123456 | 1 | 123456 | yes 2 | 654321 | 2 | 654321 | no and this is the second query SELECT table_C.*, table_D.* FROM table_C INNER JOIN table_D ON table_C.code = table_D.code INNER JOIN table_B ON table_D.code = table_B.code WHERE table_B.complete = 'yes' and again the output table_C.id | table_C.code | table_D.id | table_D.field2 | table_B.complete ======================================================================================== 1 | 123456 | 1 | 123456 | yes What I've been trying to for the last couple of days is join the 2 queries together to make one query that returns this table_A.id | table_A.code | table_B.id | table_B.code | table_B.complete | table_C.id | table_C.code | table_D.id | table_D.field2 | table_B.complete ==================================================================================================================================================================================== 1 | 123456 | 1 | 123456 | yes | 1 | 123456 | 1 | 123456 | yes 2 | 654321 | 2 | 654321 | no All i want it to do is get all rows from tables A and B and return all rows from C and D only if table_B.complete equals "yes". All tables are joined by the code column which all have the same value
-
I have an array like this $rows = array( array( 'fruit.name' => 'Apple', 'fruit.colour' => 'Red', 'fruit.weight' => '0.1', 'vegetable.name' => 'Carrot', 'vegetable.colour' => 'Orange', 'vegetable.weight' => '0.05' ), array( 'fruit.name' => 'Banana', 'fruit.colour' => 'Yellow', 'fruit.weight' => '0.7', 'vegetable.name' => 'Potato', 'vegetable.colour' => 'Brown', 'vegetable.weight' => '0.6' ) ); And i want to be able to sort the array into 2 other arrays called 'fruits' and 'vegetables' based on the first part of the key name so up to the decimal point. With this array I should have 2 rows in each of the fruits and vegetable arrays. I have this code but it doesn't work and I can't see what I'm doing wrong. $fruits = array(); $vegetables = array(); foreach($rows as $row) { foreach($row as $key => $value) { if('fruit' == substr($key, 0, strpos($key, '.'))) { $fruits[$key] = $row; } else { $vegetables[$key] = $row; } } } echo "<pre>"; var_dump($fruits); echo "</pre>"; When i do a var_dump i get this array(3) { ["fruit.name"]=> array(6) { ["fruit.name"]=> string(6) "Banana" ["fruit.colour"]=> string(6) "Yellow" ["fruit.weight"]=> string(3) "0.7" ["vegetable.name"]=> string(6) "Potato" ["vegetable.colour"]=> string(5) "Brown" ["vegetable.weight"]=> string(3) "0.6" } ["fruit.colour"]=> array(6) { ["fruit.name"]=> string(6) "Banana" ["fruit.colour"]=> string(6) "Yellow" ["fruit.weight"]=> string(3) "0.7" ["vegetable.name"]=> string(6) "Potato" ["vegetable.colour"]=> string(5) "Brown" ["vegetable.weight"]=> string(3) "0.6" } ["fruit.weight"]=> array(6) { ["fruit.name"]=> string(6) "Banana" ["fruit.colour"]=> string(6) "Yellow" ["fruit.weight"]=> string(3) "0.7" ["vegetable.name"]=> string(6) "Potato" ["vegetable.colour"]=> string(5) "Brown" ["vegetable.weight"]=> string(3) "0.6" } } Any help please getting this to separate the array into 2 arrays each containing either fruits or vegetables.
-
radio button value 0 in $_POST shows "on" in var_dump
AdRock replied to AdRock's topic in PHP Coding Help
Yes. That was a typo and I've narrowed it down to a form class I use that generated form elements. Actually writing the html markup does work but my form class seems to drop the zero value. I might have to set the form values to yes/no and then convert that to a 0/1 before it goes into database. Anyway thanks for your help. At least it helped my identify the problem -
Have a look in your php.ini and see if short_open_tag is set to on. If no, you can set it to on otherwise replace <? with <?php Also it looks like it's reading that file code that connects to database as text
-
Whenever I try and post a form with radio buttons like this <input type="radio" name"whatever" value="0"> and I do a var_dump($_POST) it always shows array(11) {["whatever"]=> string(2) "on" } but this works and will display 1 in the var_dump <input type="radio" name"whatever" value="1"> Why is this. I need the value set to 0 because that's the value going into the database. I don't really want to do a str_replace just to replace "on" with "0"
-
Is that the error that gets output to the screen or in the error log? A bit more information would help. How are you trying to run it etc?
-
I have been following an article on creating bullet proof sessions but I'm having problems with session variables i'm creating getting destroyed I call the session_start() like this SessionManager::sessionStart('MySession', 0, '/', 'localhost'); But when i try to add new session vars, i think the preventHijacking() function is is getting called for some reason and it wipes out the session and creates a new one. Any ideas how I can get this to work? Here is the link http://blog.teamtreehouse.com/how-to-create-bulletproof-sessions And here is the complete code class SessionManager{ static function sessionStart($name, $limit = 0, $path = '/', $domain = null, $secure = null) { // Set the cookie name session_name($name . '_Session'); // Set SSL level $https = isset($secure) ? $secure : isset($_SERVER['HTTPS']); // Set session cookie options session_set_cookie_params($limit, $path, $domain, $https, true); session_start(); // Make sure the session hasn't expired, and destroy it if it has if(self::validateSession()) { // Check to see if the session is new or a hijacking attempt if(!self::preventHijacking()) { // Reset session data and regenerate id $_SESSION = array(); $_SESSION['IPaddress'] = $_SERVER['REMOTE_ADDR']; $_SESSION['userAgent'] = $_SERVER['HTTP_USER_AGENT']; self::regenerateSession(); // Give a 5% chance of the session id changing on any request } elseif(rand(1, 100) <= 5) { self::regenerateSession(); } } else { $_SESSION = array(); session_destroy(); session_start(); } } static protected function preventHijacking() { if(!isset($_SESSION['IPaddress']) || !isset($_SESSION['userAgent'])) return false; if ($_SESSION['IPaddress'] != $_SERVER['REMOTE_ADDR']) return false; if( $_SESSION['userAgent'] != $_SERVER['HTTP_USER_AGENT']) return false; return true; } static function regenerateSession() { // If this session is obsolete it means there already is a new id if(isset($_SESSION['OBSOLETE'])) return; // Set current session to expire in 10 seconds $_SESSION['OBSOLETE'] = true; $_SESSION['EXPIRES'] = time() + 10; // Create new session without destroying the old one session_regenerate_id(false); // Grab current session ID and close both sessions to allow other scripts to use them $newSession = session_id(); session_write_close(); // Set session ID to the new one, and start it back up again session_id($newSession); session_start(); // Now we unset the obsolete and expiration values for the session we want to keep unset($_SESSION['OBSOLETE']); unset($_SESSION['EXPIRES']); } static protected function validateSession() { if( isset($_SESSION['OBSOLETE']) && !isset($_SESSION['EXPIRES']) ) return false; if(isset($_SESSION['EXPIRES']) && $_SESSION['EXPIRES'] < time()) return false; return true; } }
-
Is there a nicer, cleaner more efficient and less code way of achieving this? I have an array of rows from the database and 2 of the columns could have either of 2 values which give me 4 possibilities. I want to loop through each of them and assign the row to one of 4 arrays so they are all separated out. This is what i have so far. Haven't tested it yet but the theory makes sense. if(!empty($rows)) { foreach($rows as $key => $row) { switch($row['type']) { case 'post': switch($row['archived']) { case 0: $array1[$key] = $row; break; case 1: $array2[$key] = $row; break; default: } break; case 'event': switch($row['archived']) { case 0: $array3[$key] = $row; break; case 1: $array4[$key] = $row; break; default: } break; default: } } }
-
I have problem with my code. What i'm trying to do is loop through a 2d array first looking at the level so i should have 8 <div class="group">. I then need to loop through the inner part of the array and i need to create groups of 4 so i should start with <div class="slide"> and close it after 4 items and if there are more repeat this process. The problem lies with this part. If i take it out it works but i need to get this in like shown below in my example output Problem code <?php if ($count % NUMCOLS == 0) echo '<div class="slide">'; # new row ?> <?php echo $count; ?> <?php $count++; ?> <?php if ($count % NUMCOLS == 0) echo '</div>'; # new row ?> Full code <?php define ("NUMCOLS",4); ?> <?php foreach ($this->level as $level => $courses): ?> <?php $count = 0; ?> <div class="group" id="level<?=$level;?>"> <div class="controls"><button class=prev>Previous</button> <button class=next>Next</button></div> <div class="pics" data-fx="scrollLeft" data-speed=300> <?php foreach ($courses as $course => $records): ?> <?php foreach ($records as $record): ?> <?php if ($count % NUMCOLS == 0) echo '<div class="slide">'; # new row ?> <?php echo $count; ?> <?php $count++; ?> <?php if ($count % NUMCOLS == 0) echo '</div>'; # new row ?> <?php endforeach; ?> <?php endforeach; ?> </div> </div> <?php endforeach; ?> Actual output <div class="group" id="level1"> <div class="controls"><button class=prev>Previous</button> <button class=next>Next</button></div> <div class="pics" data-fx="scrollLeft" data-speed=300> <div class="group" id="level2"> <div class="controls"><button class=prev>Previous</button> <button class=next>Next</button></div> <div class="pics" data-fx="scrollLeft" data-speed=300> <div class="slide"> </div> <div class="slide"> </div> </div> </div> </div> </div> desired output <div class="group" id="level1"> <div class="controls"><button class=prev>Previous</button> <button class=next>Next</button></div> <div class="pics" data-fx="scrollLeft" data-speed=300> <div class="slide"> </div> <div class="slide"> </div> </div> </div> <div class="group" id="level2"> <div class="controls"><button class=prev>Previous</button> <button class=next>Next</button></div> <div class="pics" data-fx="scrollLeft" data-speed=300> <div class="slide"> </div> <div class="slide"> </div> </div> </div>
-
Just turned out to be a simple foreach not a nested foreach. Just a simple solution and I was blinded by the obvious
-
I have an array like but larger and it could have different types and levels. This array is taken from MySQL and I've called it $courses array(23) { [0]=> array( { ["name"]=> string(43) "Conservation of Decorative Arts" ["type"]=> string(12) "conservation" ["url"]=> NULL ["level"]=> string(1) "1" } [1]=> array( { ["name"]=> string(32) "Diploma in Restoration" ["type"]=> string(12) "conservation" ["url"]=> NULL ["level"]=> string(1) "1" } [2]=> array( { ["name"]=> string(20) "Diploma in Finishing" ["type"]=> string(12) "craft" ["url"]=> NULL ["level"]=> string(1) "1" } What I want to do is output the array so i can echo out the Name and URL and order it by Type so i get something like <h1>Conservation</h1> <ul> <li><a href=""></a></li> <li><a href=""></a></li> <li><a href=""></a></li> </ul> <h1>Craft</h1> <ul> <li><a href=""></a></li> <li><a href=""></a></li> <li><a href=""></a></li> </ul> I 've tried using nested foreach() loops but it prints the same value out multiple times so instead of about 15 rows, i end up with about 100 with loads of duplicate rows one after the other // $this->courses is the MySQL array <?php foreach($this->courses as $course): ?> <?php foreach($course as $key => $value): ?> <li><?=$course['name'];?></li> <?php endforeach; ?> <?php endforeach; ?> What am i doing wrong?
-
It looks like you've created a function called doforget() but you don't call it
-
Instead of querying the database for all the users, why don't you do a SELECT COUNT from `users` WHERE username=$username Do a numrows and if it's 1 then it's taken else it's free. Just noticed in your while loop were you set $i = 1, you should exit the loop otherwise it will overwrite it
-
I have this line of code where i want to get the value of SUM(amount) list($number,$sum) = $this->db->query('SELECT COUNT(*), SUM(amount) FROM dc_donations'); but I get this notice At the moment the table is empty and the amount column is of type float so when i run the query through phpMyAdmin it comes back with NULL for the amount. I need that amount for this line so if the table is empty, it's obviously 0 // Calculating how many percent of the goal were met: $percent = round(min(100*($sum/GOAL),100));
-
I have a database class that uses PDO and it all works until i need to do an update where I increment the value What I have is a table and one of the columns is called 'counter' and I need to update this table every time a page is visited This is the function that handles all the PDO and creates the query /** * update * @param string $table A name of table to insert into * @param string $data An associative array * @param string $where the WHERE query part */ public function update($table, $data, $where) { ksort($data); $fieldDetails = NULL; foreach($data as $key=> $value) { $fieldDetails .= "`$key`=:$key,"; } $fieldDetails = rtrim($fieldDetails, ','); $sth = $this->prepare("UPDATE $table SET $fieldDetails WHERE $where"); foreach ($data as $key => $value) { $sth->bindValue(":$key", $value); } $sth->execute(); } and this is how I call the function by passing parametres to the function $board = ucwords(str_replace('-',' ',$board)); $sql = "SELECT boardid from boards WHERE boardname = :board"; $rows = $this->db->select($sql, array(':board' => $board)); $postData = array( 'counter' => 'counter+1', ); $this->db->update('topics', $postData, "`topicid` = {$topic} AND `boardid` = {$rows[0]['boardid']}"); It fails the update with this error message The counter column is of type INT