0

php is adding ="" to the end of a string when I try to echo a button in the onclick property.

This gets sql data on an XAMPP server. It loops through and builds essentially a calendar showing all my bills and if I have paid them each month. I am using AJAX to update the database and change the paid value on a button click for each month.

I've tried various methods of using single and double quotes and escaping the quotes inside the string, but I still can't get it to output correctly.

echo $billName
foreach ($months as $v) {
//$clickstring = 'onclick="setCalendar("'.$billName.'","'.$v.'")';
$clickstring = "onclick=\"setCalendar(\"".$billName."\",\"".$v."\")";
if ($row["$v"] == "1") {
echo '<button class="paidBtn green-text"'.$clickstring . '><i class="fa fa-check" aria-hidden="true"></i></button>';
} else {
echo '<button class="unpaidBtn red-text"'.$clickstring.'><i class="fa fa-times" aria-hidden="true"></i></button>';
}

Say for instance on the first iteration $billname = "Amazon"; and $v = "jan". On the first echo Amazon is correct. However when it uses the same variable in the double click it inserts a space before it, and seems to perform a strtolower(). jan is inserted correctly, but it puts extra characters and quotation marks afterward. Here is the html output from the browser:

<button class="unpaidBtn red-text" onclick="setCalendar(" amazon","jan")=""><i class="fa fa-times" aria-hidden="true"></i></button>

2 Answers 2

1

The problem is the html you are echoing out will look something like this

onclick="setCalendar("something", "month")"

Notice how you've got double-quote inside double-quote on that HTML attribute? You can't do that because it prematurely ends your onclick. You can get around this various ways like escaping it with a \ but that gets complicated because then your php you have to escape the \ which looks like \\ and that just gets crazy.

Just one possible way to rewrite this, using single quotes for the onclick arguments

echo $billName;

foreach ($months as $v) {
    $className = ($row[$v] == 1) ? 'paidBtn green-text' : 'unpaidBtn red-text';
    $icon = ($row[$v] == 1) ? 'check' : 'times';
    echo "<button class=\"$className\" onclick=\"setCalendar('$billName', '$v'\")>";
    echo "<i class=\"fa fa-$icon\" aria-hidden=\"true\"></i></button>";
}

I also refactored this a bit with ternaries and took out the if that had the html twice, which is a bit redundant IMO. And took out the string concatenation to make it a bit easier to read.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you for the help and cleaning up the code. The output is closer to what I need, but not quite yet. This is now the output: <button class="unpaidBtn red-text" onclick="setCalendar('Amazon', 'jan'" )=""><i class="fa fa-times" aria-hidden="true"></i></button>
0

I found the solution. I'm leaving the question up if in case anyone comes across the same problem. $clickstring = "onclick=\"setCalendar('".$billName."','".$v."')\"";

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.