Why can't I run this query through PHP mysql->query but works fine directly using PHPMyAdmin
This is baffling me, every other query works... (simple queries though):
function get_avail_timeslots($durationmin=120) { $td = date('Y-m-d'); $sql = <<< THISSQLSET @stdt := '{$td}';SELECT avail.num , avail.user , avail.start_at as avail_start_dt_time , avail.end_at as avail_end_dt_time , avail.on_dt as just_date_no_time , avail.start_time as user_start_time , avail.end_time as user_end_timeFROM ( SELECT dts.num, dts.on_dt, dts.start_at, dts.end_at, uh.user, uh.start_time, uh.end_time FROM ( /* generates 1000, starting at a variable date */ SELECT num + 1 as num , @stdt on_dt , DATE_ADD(@stdt, INTERVAL (slots.num * {$durationmin}) MINUTE) start_at , DATE_ADD(@stdt, INTERVAL ((slots.num + 1) * {$durationmin}) MINUTE) end_at FROM ( /* generates 1000 rows 0 to 999 */ SELECT `hundreds`.digit * 100 + `tens`.digit * 10 + `ones`.digit AS num FROM ( SELECT 0 AS digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 ) `ones` CROSS JOIN ( SELECT 0 AS digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 ) `tens` CROSS JOIN ( SELECT 0 AS digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 ) `hundreds` ) `slots` ) `dts` INNER JOIN user_hours `uh` ON uh.start_time < dts.end_at AND uh.end_time > dts.start_at ) `avail`LEFT JOIN user_hours_breaks `uhb` ON uhb.start_time < avail.end_at AND uhb.end_time > avail.start_atLEFT JOIN appointments `app` ON app.start_time < avail.end_at AND app.end_time > avail.start_atWHERE uhb.id IS NULLAND app.id IS NULL;THISSQL;return getrows($sql);}print_r(get_avail_timeslots(120));$con=mysqli_connect($GLOBALS['mysql_host'], $GLOBALS['mysql_user'], $GLOBALS['mysql_pass'], $GLOBALS['mysql_db']);function getrows($query) { global $con; global $f; $result = $con->query($query) or $f->logthis("MySQL Query Error. Query: $query. Error: " . $con->error, 'Error', 'library.php', 'SQL Error'); $rows = array(); while($row = $result->fetch_assoc()) $rows[] = $row; return $rows; }
;
. Error: 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 'SELECT avail.num
, avail.user
, avail.start_at as avail_start_dt' at line 3
MySQL ServerPHP
Last Comment
Mark
8/22/2022 - Mon
Dave Baldwin
phpMyAdmin will split your query up into chunks that can be processes. The 'mysqli' driver however will only process one query at a time. "SELECT avail.num" is the start of a second query in the view of the 'mysqli' driver. Yes, I realize that phpMyAdmin uses the same driver... but it has code to parse your SQL into the 'right size' pieces. Everywhere you have ';' is the end of a query.