$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
$stmt = $dbh->prepare($query);
print_r($fullStmt);
if(!$stmt->execute($fullStmt))
{
print_r($stmt->errorInfo());
$full_query = "INSERT INTO `fixtures` (competition_code,competition_id,competition_name,season_id,season_name,
timestamp,uid,last_modified,matchday,period,matchwinner,date,team1,team1_halfscore,team1_score,team1_goals,
team1_side,team2,team2_halfscore,team2_score,team2_goals,team2_side) VALUES (";
foreach($fullStmt as $val){ $full_query.= "'$val', "; }
$full_query = trim($full_query, ", ");
$full_query.= ");";
exit($full_query);
}
Array
(
[competition_code] => EN_PR
[competition_id] => 8
[competition_name] => English Barclays Premier League
[season_id] => 2013
[season_name] => Season 2013/2014
[timestamp] => 2013-10-30 09-03-49
[uid] => g695281
[last_modified] => 2013-10-15T12:35:58+00:00
[matchday] => 1
[period] => FullTime
[matchwinner] => t7
[date] => 2013-08-17 15:00:00 BST
[team1] => t3
[team1_halfscore] => 1
[team1_score] => 1
[team1_goals] => p44346/#/Goal
[team1_side] => Home
[team2] => t7
[team2_halfscore] => 1
[team2_score] => 3
[team2_goals] => p54861/#/Goal//p83564/#/Goal//p54861/#/Penalty
[team2_side] => Away
)
Array
(
[0] => HY093
[1] =>
[2] =>
)
INSERT INTO `fixtures` (competition_code,competition_id,competition_name,season_id,season_name,
timestamp,uid,last_modified,matchday,period,matchwinner,date,team1,team1_halfscore,team1_score,team1_goals,
team1_side,team2,team2_halfscore,team2_score,team2_goals,team2_side) VALUES ('EN_PR', '8', 'English Barclays Premier League', '2013', 'Season 2013/2014', '2013-10-30 09-03-49', 'g695281', '2013-10-15T12:35:58+00:00', '1', 'FullTime', 't7', '2013-08-17 15:00:00 BST', 't3', '1', '1', 'p44346/#/Goal', 'Home', 't7', '1', '3', 'p54861/#/Goal//p83564/#/Goal//p54861/#/Penalty', 'Away');
$fullStmt
is an array of values, and I have a query as follows:
$query = "INSERT INTO `fixtures` (
competition_code,
competition_id,
competition_name,
season_id,
season_name,
timestamp,
uid,
last_modified,
matchday,
period,
matchwinner,
date,
team1,
team1_halfscore,
team1_score,
team1_goals,
team1_side,
team2,
team2_halfscore,
team2_score,
team2_goals,
team2_side
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
However, when trying to execute, it returns FALSE
. I output the resulting query and when directly inserting it into phpMyAdmin it inserts successfully.
Why does it insert without issue when I run the code in the SQL field in phpMyAdmin but not when executing in PHP?
I wasn't certain of this behavior in PDO until testing for myself, but since your array of values in $fullStmt
is an associative array, PDO is in fact making an attempt to bind named parameters based on its array keys. Your originally prepared statement uses positional ?
placeholders, so the named parameters are not present (and they cannot be mixed with ?
).
So you need to eliminate the array keys for PDO to correctly bind the array values with their positional placeholders. That's most easily done by calling array_values()
on the array as it is passed to execute()
.
// Strip off the associative array keys...
if(!$stmt->execute(array_values($fullStmt))) {
// etc
}
Note that PDO's correct interpretation of the array's order depends on its values being in exactly the correct order to begin with. Your $fullStmt
array does happen to be in the correct order by whatever means you've produced it. If that process changes however, stripping off the array keys may result in your INSERT
statement placing values into the wrong columns. It may be worth the effort to refactor your statement generation to use named parameters like :competition_code
in the VALUES ()
list and continue using the associative array to protect against this potential tripping point.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.